|
|
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Проблема такого плана. Существует класс в котором запущен Thread который вызывает эту функцию. Объектов класса может быть несколько сотен, следовательно каждый из них может вызывать эту функцию. Очень часто соединения долго не закрываются. Такое ощущение что хранимая процедура синхронная и пока какой-то поток не выполнит ее, все остальные ждут. Из-за этого некоторые соединения весят по N секунд, хотя сама процедура выполняется по 2-5 миллисекунды. Что не так в коде? Заранее огромное спасибо! Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2013, 16:13:01 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
GorloPavel, в субд параллелизм делается за счёт параллельных коннектов. а не потоков в одном коннекте. Так заточены СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2013, 16:18:32 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Petro123GorloPavel, в субд параллелизм делается за счёт параллельных коннектов. а не потоков в одном коннекте. Так заточены СУБД. Так коннекты то разные получаются. Каждый поток выполняет функцию. И соединение открывается при каждом ее использовании. Получается 10 потоков = 10 соединений. А вот почему долго не падает в finally в некоторых случаях я не пойму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2013, 16:53:44 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
GorloPavelPetro123GorloPavel, в субд параллелизм делается за счёт параллельных коннектов. а не потоков в одном коннекте. Так заточены СУБД. Так коннекты то разные получаются. Каждый поток выполняет функцию. И соединение открывается при каждом ее использовании. Получается 10 потоков = 10 соединений. А вот почему долго не падает в finally в некоторых случаях я не пойму. проверил? Протестировал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2013, 17:00:20 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Твой код тормозит на mResult=mStatement.executeQuery() ? Если да - тогда проблема не в Java. Выкладывай текст хранимой процедуры на неизвестном языке и будем дальше думать куда переносить твой вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2013, 17:18:24 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Petro123GorloPavelпропущено... Так коннекты то разные получаются. Каждый поток выполняет функцию. И соединение открывается при каждом ее использовании. Получается 10 потоков = 10 соединений. А вот почему долго не падает в finally в некоторых случаях я не пойму. проверил? Протестировал? А что тут проверять. Очевидно. У каждого объекта класса есть эта функция. При вызове функции в ее теле создается подключение. И SHOW FULL PROCESSLIST мне показывает несколько подключений. Проблема в том что некоторые подключения живут по 2мс как и положено, а другие по 500 что не является нормальным. В коде тут есть ошибка... Надо: if(mConnection!=null){mConnection.close();}. Но в реальном коде все как положено. Это просто я сейчас эксперементировал и убирал эту строку и незаметил как скопипастил в пост. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2013, 17:20:33 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Процедура простая: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2013, 17:23:17 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
GorloPavelТакое ощущение что хранимая процедура ну дак и приведи трейс только для хранимки. Без всякой обвязки и цикла по рекордсету. И коммит тоже лишний, т.к. хранимка только читает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2013, 17:48:36 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Petro123GorloPavelТакое ощущение что хранимая процедура ну дак и приведи трейс только для хранимки. Без всякой обвязки и цикла по рекордсету. И коммит тоже лишний, т.к. хранимка только читает. Про коммит понял. А вот как мне тут от цикла избавиться я не понял :). Кстати тут кокраз массив из тех самых объектов в котором эта функция. В любом случае спасибо вам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2013, 17:56:26 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Petro123И коммит тоже лишний, т.к. хранимка только читает. Я бы не был так категоричен. Это зависит от уровня изоляции транзакций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2013, 18:01:53 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Не знаю как в этих ваших МайСкл-ях. Но если-бы это был Oracle то нужно оптимизировать и фазу Execute, и фазу Fetch (в зависимости от удачности выбора плана у нас может быть одно либо другое). Автор ты добавь себе SessionHelper.trace("Checkpoint1 "+hostId), после входа в процедуру, потом после execute и потом после завершения считывания строк. В самом конце. И дай кусок лога. И время в логах сделай с точостью до милисекунд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2013, 18:11:28 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Мужик, ну, если рассматривать экзотику и каждую БД, то и Java не нужна. Изоляция по умолчанию. При обрыве сети ничего без коммита не отвалится...всего один SQL оператор. Там и хранимку можно убрать imho ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2013, 18:26:21 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Хранимку нужно убрать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2013, 18:30:49 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Мы не знаем где хранимка ЕЩЕ используется. Убирать нельзя. Но можно переписать этот код так чтобы от нее не было зависимости в Java. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2013, 19:18:31 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
maytonМы не знаем где хранимка ЕЩЕ используется. Убирать нельзя. Но можно переписать этот код так чтобы от нее не было зависимости в Java. Больше нигде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 04:23:36 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
GorloPavelЧто не так в коде? Типичный размер Hub.SESSIONS какой? Какое количество записей в среднем возвращает ваш запрос? У вас на ровном месте сложность цикла O(N*M), где N - размер Hub.SESSIONS, M - размер возвращаемых данных. Вы бы ваш sessions во что-нибудь более приличное преобразовали. В какой-нибудь Map, что-ли. Или не преобразовали, а ввели дополнительный map. Тогда сложность будет либо O(N + M), либо O((M + N) * log(N)), зависит от того, какую map вы возьмете. Еще. Покажите код вашего SESSIONS[i].sendData. Может, у вас там код тормозит, а не в обращении к хранимке. А открытый курсор (итерации) по результату держат соединения, пока все не обработается. Ну и на последок. Ваша хранимка оптимально устроена? Вы ее план смотрели? С альтернативами вроде select distinct сравнивали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 09:24:34 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
GorloPavelmaytonМы не знаем где хранимка ЕЩЕ используется. Убирать нельзя. Но можно переписать этот код так чтобы от нее не было зависимости в Java. Больше нигде. Поставь логгирование и дай цифры. Мнеж интересно где в этом Мускле может быть тормоз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 10:13:34 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Функция sendData: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 15:45:39 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
maytonGorloPavelпропущено... Больше нигде. Поставь логгирование и дай цифры. Мнеж интересно где в этом Мускле может быть тормоз. Кусок лога(в скобках System.currentTimeMillis()): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 15:52:08 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Запустите под профайлером или просто делайте дампы потоков. Там будет четко видно на чем потоки блокируются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 15:57:25 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
ОК. HostId-s немного смешались. Надо будет рассортировтать их и посчитать интервалы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 15:59:59 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЗапустите под профайлером или просто делайте дампы потоков. Там будет четко видно на чем потоки блокируются. Знать бы еще как это делать. Приложение запущено на удаленной машине. Как снять дамп? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:00:31 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
kill -3 PID можно jdk/bin/jstack PID ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:03:11 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
maytonОК. HostId-s немного смешались. Надо будет рассортировтать их и посчитать интервалы. Легко вычислить тормозов... Там где сразу подряд finish, значит они не так быстро сработали. Количество SESSIONS = 13k. Количество возвращаемых записей в большинстве случаев не более 2-5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:04:30 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
А какой размер SESSIONS[]? По одному элементу на поток, или меньше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:04:43 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Blazkowiczkill -3 PID можно jdk/bin/jstack PID Сейчас 9к потоков. Как потом найти тормоза? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:06:08 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
BlazkowiczА какой размер SESSIONS[]? По одному элементу на поток, или меньше? 13к. Но незанятые null. Что я и проверяю в цикле тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:06:56 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Нужно отобрать те, которые заблокированы и посмотреть на чем они заблокированы, на JDBC или на synchronized. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:11:57 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Фига се... 9к потоков. Зачэм стока? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:13:40 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
А можно как-то поймать момент, когда соединение висит N секунд и снять в этот момент дамп потоков? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:15:34 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
BlazkowiczФига се... 9к потоков. Зачэм стока? Ну сервер в работе :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:17:22 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
BlazkowiczА можно как-то поймать момент, когда соединение висит N секунд и снять в этот момент дамп потоков? Сейчас попробую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:17:42 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
GorloPavelНу сервер в работе :) Дык по потоку на сессию, это как-то расточительно. Всё равно активных потоков минимум. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:20:37 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
BlazkowiczGorloPavelНу сервер в работе :) Дык по потоку на сессию, это как-то расточительно. Всё равно активных потоков минимум. Это сокет соединения. Они должны быть всегда online. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:21:41 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Можно зашедулить jstack, и запустить тест. Потом отобрать тот дамп, который создан в момент "зависания", согласно логу теста. Правда, боюсь, с 9К потоков jstack может отнимать слишко много времени :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:22:46 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
GorloPavelЭто сокет соединения. Они должны быть всегда online. И что? Из 9K потоков у вас 99% всегда спят. Хорошо что переключение контекста на современном железе уже не такое дорогое. Иначе бы всё умерло. Ну, и линух решает тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:24:32 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
а что мешает для начала запустить отдельный инстанс с 1 потоком и посмотреть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:25:27 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
GorloPavel, - сказал же - выруби в коде хождение по датасету и проверь тормоза - потом ходи по датасету вхолостую Обычный метод поиска неисправности вырубая блоки поочерёдно. Логирование - это второй метод поиска. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:27:13 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Если это game сервер и среди этих 9К сессий много активных, то вполне возможно что sendData этого потока рассылки постоянно конкурирует с остальными 9К потоков за многие synchronized. Пессимистичные блокировки вообще в многопоточном сервере - зло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:35:30 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЕсли это game сервер и среди этих 9К сессий много активных, то вполне возможно что sendData этого потока рассылки постоянно конкурирует с остальными 9К потоков за многие synchronized. Пессимистичные блокировки вообще в многопоточном сервере - зло. Это сервер одного популярного приложения для OS Android. Ну ведь synchronized sendData актуален только для самого потока. Он никак не может конкурировать с остальными. Максимум с одним. Хотя... Hub.GSON.toJson это static поле в классе Hub. И насколько я понял GSON потокобезопасен, следовательно synchronized. Вот тогда он и может конкурировать с остальными 9к, так как в них существует еще несколько функций с использованием GSON. Может в этом проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:41:57 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
GorloPavel, автор потокобезопасен, следовательно synchronized совсем не обязательно. Хотя GSON вообще сам по себе очень медленный, если его использовать без кастомных мапперов. Проблема ещё может быть в fetchSize = 1 (у постгре по дефолту кажется 1), поставьте его чуть более чем ожидаете получить записей (ну если их не более 2-3, как Вы утверждаете). Алсо непонятно зачем там комит и автокомит, вы же вроде только читаете данные (хотя тут я не уверен, давно в голом jdbc не копался). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:47:06 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
GorloPavelНу ведь synchronized sendData актуален только для самого потока. Что значит актуален? У вас в SESSION, вероятно есть и другие synchronized методы, которые гарантируют целостность записи пакетов в сокет. И у вас 9К потоков, которые использую эти методы. С этим проблем нет, и даже перфоманс нормальный, благодаря Biased Locking. Но тут приходится 9К+1й поток и начинает использовать те же самые сокеты, работа с которыми синхронизирована. В результате в 9К вызов sendData N% приводят к блокировке на synchronized. Вот такая теория... Кстати ещё интересно, если вдруг у вас в SESSION есть и запись и чтение, то они используют один и тот же лок. Хотя запись с чтением сокета могут происходить безопасно в разных потоках. GorloPavel Он никак не может конкурировать с остальными. Максимум с одним. Почему? Из 9К потоков только один активный? GorloPavelИ насколько я понял GSON потокобезопасен, следовательно synchronized. facepalm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:48:42 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Вообще запуск с сэмплирующим профайлером или просто анализ дампов может показать причину без всяких угадаек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:49:57 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
автор Хотя GSON вообще сам по себе очень медленный, если его использовать без кастомных мапперов. Что посоветуете? Сейчас я пользуюсь сериализацией-десереализацией. Воде быстренько все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:50:37 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
GorloPavel, Для начала бы локализовать текущую проблему ). GorloPavelВоде быстренько Ну не знаю как сейчас, я пару лет назад смотрел, массив из 1000 даблов сериализовался около 1 секунды на Core 2 duo 2ГГц. Но там можно прикручиавть свои мапперы, чтоб не использовалась рефлексия и т.п., так что я думаю надо посмотреть что к чему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:55:52 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
BlazkowiczGorloPavelНу ведь synchronized sendData актуален только для самого потока. Что значит актуален? У вас в SESSION, вероятно есть и другие synchronized методы, которые гарантируют целостность записи пакетов в сокет. И у вас 9К потоков, которые использую эти методы. С этим проблем нет, и даже перфоманс нормальный, благодаря Biased Locking. Но тут приходится 9К+1й поток и начинает использовать те же самые сокеты, работа с которыми синхронизирована. В результате в 9К вызов sendData N% приводят к блокировке на synchronized. Вот такая теория... Кстати ещё интересно, если вдруг у вас в SESSION есть и запись и чтение, то они используют один и тот же лок. Хотя запись с чтением сокета могут происходить безопасно в разных потоках. GorloPavel Он никак не может конкурировать с остальными. Максимум с одним. Почему? Из 9К потоков только один активный? GorloPavelИ насколько я понял GSON потокобезопасен, следовательно synchronized. facepalm Потому что в логике сервера с одним потоком может взаимодействовать только один поток. Включая вызывать его sendData со своими данными. Не понял как sendData одного потока может блокировать sendData во всех потоках? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:56:28 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Зашедульте jstack на каждую секунду с добавлением в файл. Запустите тест. Отшедульте jstack. В полученом файле найдите все дампы с вашим методом. Смотрите на чем чаще всего он висит. На JDBC, на socket write или sendData ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:57:23 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
GorloPavelПотому что в логике сервера с одним потоком может взаимодействовать только один поток. Включая вызывать его sendData со своими данными. Не понял как sendData одного потока может блокировать sendData во всех потоках? Всё, понял. Там не массовая рассылка на 9К сессий, а лишь на одного юзера? Т.е. sendData вызывается всего несколько раз? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 16:59:43 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
У вас лог всего на 3 точки. А нужно было больше делать - начало метода - после получения connection - после запуска запроса - после цикла - после close() И выяснить кто из них действительно тормозил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 17:02:56 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
BlazkowiczGorloPavelПотому что в логике сервера с одним потоком может взаимодействовать только один поток. Включая вызывать его sendData со своими данными. Не понял как sendData одного потока может блокировать sendData во всех потоках? Всё, понял. Там не массовая рассылка на 9К сессий, а лишь на одного юзера? Т.е. sendData вызывается всего несколько раз? Нет. Объясню. Есть к примеру два ПК между ними устанавливается связь средством удаленного сервера к которому они оба подключаются. Они могут инициировать вызов функций на сервере(авторизация, редактирование списка контактов и т.д) так и передавать данные друг другу(псевдо peer-to-peer) если невозможно подключение напрямую. В случае если они передают данные друг другу через сервер, то они вызывают перегруженный метод sendData(byte[]) друг у друга при получении данных который шлет пакет без изменений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 17:08:59 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Так же сам сервер может им обоим слать кое какие пакеты. Вот это кокраз тот случай. Хранимая процедура возвращает id сессий которым нужно разослать этот пакет. Грубо говоря у вас в списке есть 10 контактов и у меня есть 10 контактов. У вас и у меня 5 одинаковых контактов. Вдруг эти пять контактов становятся онлайн. Сервер выясняет кого нужно уведомить и рассылает данный пакет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 17:12:47 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Следовательно этот пакет получите только вы и я. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 17:14:31 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Вернее в данном случае мы получаем пакет от одного из ПК и рассылаем его нужным ПК у которых в списках он есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 17:16:49 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
А эту задачу нельзя было решать на уровне триггеров на users_online, hosts_online? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 17:18:09 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
maytonА эту задачу нельзя было решать на уровне триггеров на users_online, hosts_online? Я к примеру написал ситуацию. Чтобы было понятно зачем так много потоков. А по вопросу... В данном случае сервер рассылает нужным клиентам не информацию о online. Тут триггера не помогут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 17:30:02 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Подход неправильный. Соединение должно возвращаться в пул не "максимально быстро", а "если больше не требуется". Ваш запрос выполняется или "постоянно" или "очень часто", поэтому надо взять соединение, подготовить запрос и выполнять его с нужными параметрами до тех пор, "пока работает" и "нет ошибок выполнения". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 19:25:25 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
Вопрос номер один -что за сервер? Какая архитектура , какие либы используете ? какой подход : spring или ejb ? какой используется pool соединений и есть ли он вообще? как он настроен? что вам дает использование хранимой процедуры ? Перейдите на select - с параметрами только чтение. Проведите рефакторинг кода - тут явно какая то ошибка в логике кода, нужна декомпозиция , но вот пока не очень пойму какая, ибо кода мало. Какое количество коннектов допускается к базе? сколько из них задействовано ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2013, 20:31:46 |
|
||
|
Долгое закрытие JDBC
|
|||
|---|---|---|---|
|
#18+
GorloPavelФункция sendData У вас ввод/вывод блокирующий. Выходного буфера для sendMessage может не хватить, клиент отвалился - вы будете висеть в ожидании записи/таймаута. GorloPavelКоличество возвращаемых записей в большинстве случаев не более 2-5. Ну вот и выберите их сначала в список. Закройте соединение с базой. А потом по списку уже начинайте уведомлять. При таком количестве вместо списка еще рекомендуется какой-нибудь map. Тогда вместо 20000 итераций у вас будет 2-5. Но проблему с тем, что запись к определенному клиенту может заблокироваться на выводе, это не решит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2013, 09:34:22 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2128352]: |
0ms |
get settings: |
9ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
180ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
105ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 555ms |

| 0 / 0 |
