|
|
|
Долгое закрытие 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 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38438528&tid=2128352]: |
0ms |
get settings: |
9ms |
get forum list: |
22ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
251ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 573ms |

| 0 / 0 |
