|
|
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
Есть код, который крутится на Wildfly, активно использует прямые запросы и на каждый используется конструкция вида: Код: java 1. 2. 3. 4. 5. 6. 7. Таких конструкций используется великое множество. Когда проводим нагрузочное тестирование с Apache JMeter, при 50 пользователях выедается весь коннекшн-пул. Можно ли как-то разрешить эту проблему? :) Сейчас приходит только идея - выдавать по единому коннекшну на авторизованную сессию пользователя, чтобы он, пока он находится в системе, использовал только ее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 15:05 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
Emmanuell GoldsteinЕсть код, который крутится на Wildfly, активно использует прямые запросы и на каждый используется конструкция вида: Код: java 1. 2. 3. Это не J(2)EE API. Нам предлагается угадать что там в блоке finally? Emmanuell GoldsteinТаких конструкций используется великое множество. Это-то в эпоху Spring и JPA. Ну, ладно. Emmanuell GoldsteinКогда проводим нагрузочное тестирование с Apache JMeter, при 50 пользователях выедается весь коннекшн-пул. Вероятно никто не возвращает соединения в пул? Или кто-то не возвращает. Emmanuell GoldsteinМожно ли как-то разрешить эту проблему? Научиться использовать try with resource. Настроить инспекции кода, которые не дадут сбилдить проект, если кто-то провтыкал закрыть JDBC ресурс. Emmanuell Goldstein :) Сейчас приходит только идея - выдавать по единому коннекшну на авторизованную сессию пользователя, чтобы он, пока он находится в системе, использовал только ее. Нет, ну так, конечно, делают иногда, но совершенно по другой причине. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 15:13 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, авторЭто не J(2)EE API. Нам предлагается угадать что там в блоке finally? Это как раз try-with-resources, тут нет finally. В пул все возвращается. Но 50 пользователей одновременно могут запустить функционал, который выполняет запросы по 2-3 секунды. В этот момент соединения не возвращаются, поскольку заняты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 15:16 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, авторtry ( Connection connection = DBConnection.getConnection(); DBSQLQueryContainer con = new DBSQLQueryContainer(connection)) { при такой в finally ничего не надо, само всё закрывается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 15:16 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
Emmanuell GoldsteinЭто как раз try-with-resources, тут нет finally. Сорь. Совсем слепой стал. Emmanuell GoldsteinНо 50 пользователей одновременно могут запустить функционал, который выполняет запросы по 2-3 секунды. Хера себе у вас запросы к базе. Просто с тем же успехом можно и пул побольше сделать. А так решения стандартные: Кэш. Очередь. Давать всем пользователям так долго насиловать базу это прямой путь закрыть себе масштабируемость. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 15:22 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
вадяавторtry ( Connection connection = DBConnection.getConnection(); DBSQLQueryContainer con = new DBSQLQueryContainer(connection)) { при такой в finally ничего не надо, само всё закрывается Форматирование кривое. Вот и не разглядел. Да и шрифт "удачный". Я так пишу Код: java 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 15:25 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
BlazkowiczПросто с тем же успехом можно и пул побольше сделать.Пул - 100 соединений. Попробовал в постгресе сделать max_connection в 500 соединений - вылетело по "открыто максимальное количество файлов" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 15:32 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
Emmanuell GoldsteinBlazkowiczПросто с тем же успехом можно и пул побольше сделать.Пул - 100 соединений. Если сделать дамп потоков, то можно увидеть кто чем занят и сравнить с утилизацией соединений. Emmanuell GoldsteinПопробовал в постгресе сделать max_connection в 500 соединений - вылетело по "открыто максимальное количество файлов" Я ж о том же. Масштабировать и оптимизировать надо, а не всем давать в базу ломиться и делать там что попало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 15:41 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
Emmanuell GoldsteinПопробовал в постгресе сделать max_connection в 500 соединений - вылетело по "открыто максимальное количество файлов" ну сделай чуть меньше. Но не 50 же. Сам сделал узкое горлышко и потом маемся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 16:02 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
Emmanuell Goldsteinвылетело по "открыто максимальное количество файлов" админ есть? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. http://postgresql.ru.net/pgtune/postgresql.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 16:04 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
Petro123Emmanuell GoldsteinПопробовал в постгресе сделать max_connection в 500 соединений - вылетело по "открыто максимальное количество файлов" ну сделай чуть меньше. Но не 50 же. Сам сделал узкое горлышко и потом маемся.Я просто думаю, а зайдет 100 пользователей, 150, 200. Встанет раком! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 16:10 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
Emmanuell GoldsteinЯ просто думаю, а зайдет 100 пользователей, 150, 200. Встанет раком! Если у вас цикл запрос-ответ измеряется секундами, то раком встанет на много раньше. И дело тут совсем не в пуле соединений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 16:14 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
Emmanuell Goldstein, не знаю, как твоя БД, а оракле выдержит и 1000 соединений _корпоративе_. Есть веб-приложения, есть десктоп, есть сайты визитки. Есть OLAP\OLTP. Ни у кого раком не встаёт, и у всех по разному. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 16:53 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
Emmanuell Goldstein, анализируй нагрузку по ТЗ + тесты. А потом конкретно можно. Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 16:54 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
Petro123не знаю, как твоя БД, а оракле выдержит и 1000 соединений _корпоративе_.На сравнимых доступных ресурсах все могут "тысячу соединений выдержать". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 17:34 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
Emmanuell GoldsteinКогда проводим нагрузочное тестирование с Apache JMeter, при 50 пользователях выедается весь коннекшн-пул1. Что конкретно делают ваши запросы? 2. Соединение должно возвращаться в пул не "сразу же", а "тогда, когда оно больше не требуется". А это возвращает нас к первому вопросу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 17:36 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, если так, и в ТЗ стоит макс в пике = 1000, то и сабж не имеет смысла. Ставить на 1000 и всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 18:00 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
Petro123если так, и в ТЗ стоит макс в пике = 1000, то и сабж не имеет смысла. Ставить на 1000 и всё."Сдуру можно и член сломать. Даже если он дубовый". В моей практике было три аварийных останова с одинаковыми симптомами - конкуренция на обновлениях строк одной из таблиц и сопутствующая конкуренция за блокировки кэша запросов. И всё это - задолго до исчерпания лимита подключений. А всё потому, что разработчики вместо "подумать" - воткнули шаблонный код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 18:14 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
Emmanuell Goldstein, Судя по вашему, описания вы считаете что контейнер DBSQLQueryContainer con = new DBSQLQueryContainer(connection)) сделает за вас всю работу по возвращению соединения обратно в пул соединений. Он да конечно вернет соединение обратно в пул, но не сразу, а тогда когда сработает сборщик мусора. Поэтому возможно у вас и возникает проблема. Попробуйте вот так, добавить ещё один try{} finally{} DBSQLQueryContainer con = new DBSQLQueryContainer(connection)) try (Connection connection = DBConnection.getConnection(); DBSQLQueryContainer con = new DBSQLQueryContainer(connection)) { con.executeRead(query); ResultSet res = con.getResultSet(); try { if (res.first()) { while (true) { ... } } } finally { res.close(); } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2015, 20:25 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
andrej59Судя по вашему, описания вы считаете что контейнерОн не считает, он знает , что всю работу сделает try-with-resource . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2015, 20:56 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
Petro123Emmanuell GoldsteinПопробовал в постгресе сделать max_connection в 500 соединений - вылетело по "открыто максимальное количество файлов" ну сделай чуть меньше. Но не 50 же. Сам сделал узкое горлышко и потом маемся. Emmanuell Goldstein, postgres ОЧЕНЬ не любит высокий max_connections. выходы: 1) настроить pgbouncer перед базой 2) использовать это https://github.com/brettwooldridge/HikariCP ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2015, 01:28 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
andrej59Emmanuell Goldstein, Судя по вашему, описания вы считаете что контейнер DBSQLQueryContainer con = new DBSQLQueryContainer(connection)) сделает за вас всю работу по возвращению соединения обратно в пул соединений. Он да конечно вернет соединение обратно в пул, но не сразу, а тогда когда сработает сборщик мусора. Поэтому возможно у вас и возникает проблема. Попробуйте вот так, добавить ещё один try{} finally{} DBSQLQueryContainer con = new DBSQLQueryContainer(connection)) try (Connection connection = DBConnection.getConnection(); DBSQLQueryContainer con = new DBSQLQueryContainer(connection)) { con.executeRead(query); ResultSet res = con.getResultSet(); try { if (res.first()) { while (true) { ... } } } finally { res.close(); } } Не забыли в примере добавить connection.close() в finally? Connection.close() во враппере как раз отвечает за возвращение в пул. Иначе ждите GC цикла пока он не закроет соединение в finalize() обертки connection. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2015, 06:32 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
uid uniqueandrej59Emmanuell Goldstein, Судя по вашему, описания вы считаете что контейнер DBSQLQueryContainer con = new DBSQLQueryContainer(connection)) сделает за вас всю работу по возвращению соединения обратно в пул соединений. Он да конечно вернет соединение обратно в пул, но не сразу, а тогда когда сработает сборщик мусора. Поэтому возможно у вас и возникает проблема. Попробуйте вот так, добавить ещё один try{} finally{} DBSQLQueryContainer con = new DBSQLQueryContainer(connection)) try (Connection connection = DBConnection.getConnection(); DBSQLQueryContainer con = new DBSQLQueryContainer(connection)) { con.executeRead(query); ResultSet res = con.getResultSet(); try { if (res.first()) { while (true) { ... } } } finally { res.close(); } } Не забыли в примере добавить connection.close() в finally? Connection.close() во враппере как раз отвечает за возвращение в пул. Иначе ждите GC цикла пока он не закроет соединение в finalize() обертки connection. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Отбой, это же try-with-resources. Пора спать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2015, 06:36 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
drsmEmmanuell Goldstein, postgres ОЧЕНЬ не любит высокий max_connections. запостите это на ветку СУБД, раз админа нету. Я в первой ссылке поиска нашёл для вас РАБОЧЕЕ значение параметра - 500 соединений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2015, 11:01 |
|
||
|
100 коннектов к СУБД на J2EE
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНастроить инспекции кода, которые не дадут сбилдить проект, если кто-то провтыкал закрыть JDBC ресурс. Blazkowicz, а можно какую нибудь ссылку, где об этом можно почитать понятным языком? Сейчас новый проект, было бы классно в самом начале такую фичу настроить. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2015, 12:50 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39121055&tid=2124590]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
151ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
85ms |
get tp. blocked users: |
2ms |
| others: | 219ms |
| total: | 507ms |

| 0 / 0 |
