powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / 100 коннектов к СУБД на J2EE
27 сообщений из 27, показаны все 2 страниц
100 коннектов к СУБД на J2EE
    #39117415
Emmanuell Goldstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть код, который крутится на Wildfly, активно использует прямые запросы и на каждый используется конструкция вида:

Код: java
1.
2.
3.
4.
5.
6.
7.
try (
    Connection connection = DBConnection.getConnection();
    DBSQLQueryContainer con = new DBSQLQueryContainer(connection)) {
        con.executeRead(query);
				
        if (con.getResultSet().first()) {
            while (true) { ...



Таких конструкций используется великое множество.

Когда проводим нагрузочное тестирование с Apache JMeter, при 50 пользователях выедается весь коннекшн-пул.

Можно ли как-то разрешить эту проблему? :) Сейчас приходит только идея - выдавать по единому коннекшну на авторизованную сессию пользователя, чтобы он, пока он находится в системе, использовал только ее.
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39117423
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Emmanuell GoldsteinЕсть код, который крутится на Wildfly, активно использует прямые запросы и на каждый используется конструкция вида:
Код: java
1.
2.
3.
try (
    Connection connection = DBConnection.getConnection();
    DBSQLQueryContainer con = new DBSQLQueryContainer(connection)) {



Это не J(2)EE API. Нам предлагается угадать что там в блоке finally?

Emmanuell GoldsteinТаких конструкций используется великое множество.

Это-то в эпоху Spring и JPA. Ну, ладно.

Emmanuell GoldsteinКогда проводим нагрузочное тестирование с Apache JMeter, при 50 пользователях выедается весь коннекшн-пул.

Вероятно никто не возвращает соединения в пул? Или кто-то не возвращает.

Emmanuell GoldsteinМожно ли как-то разрешить эту проблему?

Научиться использовать try with resource. Настроить инспекции кода, которые не дадут сбилдить проект, если кто-то провтыкал закрыть JDBC ресурс.

Emmanuell Goldstein :) Сейчас приходит только идея - выдавать по единому коннекшну на авторизованную сессию пользователя, чтобы он, пока он находится в системе, использовал только ее.
Нет, ну так, конечно, делают иногда, но совершенно по другой причине.
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39117426
Emmanuell Goldstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

авторЭто не J(2)EE API. Нам предлагается угадать что там в блоке finally? Это как раз try-with-resources, тут нет finally.

В пул все возвращается. Но 50 пользователей одновременно могут запустить функционал, который выполняет запросы по 2-3 секунды. В этот момент соединения не возвращаются, поскольку заняты.
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39117428
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

авторtry (
Connection connection = DBConnection.getConnection();
DBSQLQueryContainer con = new DBSQLQueryContainer(connection)) {
при такой в finally ничего не надо, само всё закрывается
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39117439
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Emmanuell GoldsteinЭто как раз try-with-resources, тут нет finally.
Сорь. Совсем слепой стал.

Emmanuell GoldsteinНо 50 пользователей одновременно могут запустить функционал, который выполняет запросы по 2-3 секунды.
Хера себе у вас запросы к базе. Просто с тем же успехом можно и пул побольше сделать.
А так решения стандартные:
Кэш. Очередь. Давать всем пользователям так долго насиловать базу это прямой путь закрыть себе масштабируемость.
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39117443
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяавторtry (
Connection connection = DBConnection.getConnection();
DBSQLQueryContainer con = new DBSQLQueryContainer(connection)) {
при такой в finally ничего не надо, само всё закрывается
Форматирование кривое. Вот и не разглядел. Да и шрифт "удачный".
Я так пишу

Код: java
1.
2.
3.
4.
5.
6.
try (Connection connection = DBConnection.getConnection();
     DBSQLQueryContainer con = new DBSQLQueryContainer(connection)) {

try {
    Connection connection = DBConnection.getConnection();
    DBSQLQueryContainer con = new DBSQLQueryContainer(connection)) {
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39117456
Emmanuell Goldstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczПросто с тем же успехом можно и пул побольше сделать.Пул - 100 соединений.

Попробовал в постгресе сделать max_connection в 500 соединений - вылетело по "открыто максимальное количество файлов"
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39117471
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Emmanuell GoldsteinBlazkowiczПросто с тем же успехом можно и пул побольше сделать.Пул - 100 соединений.
Если сделать дамп потоков, то можно увидеть кто чем занят и сравнить с утилизацией соединений.

Emmanuell GoldsteinПопробовал в постгресе сделать max_connection в 500 соединений - вылетело по "открыто максимальное количество файлов"
Я ж о том же. Масштабировать и оптимизировать надо, а не всем давать в базу ломиться и делать там что попало.
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39117502
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Emmanuell GoldsteinПопробовал в постгресе сделать max_connection в 500 соединений - вылетело по "открыто максимальное количество файлов"
ну сделай чуть меньше. Но не 50 же. Сам сделал узкое горлышко и потом маемся.
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39117504
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Emmanuell Goldsteinвылетело по "открыто максимальное количество файлов"
админ есть?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
 3 Среднестатистическая настройка для Web приложения, 2 ГБ памяти
    maintenance_work_mem = 128MB;
    checkpoint_completion_target = 0.7
    effective_cache_size = 1536MB
    work_mem = 4MB
    wal_buffers = 4MB
    checkpoint_segments = 8
    shared_buffers = 512MB
    max_connections = 500


http://postgresql.ru.net/pgtune/postgresql.html
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39117507
Emmanuell Goldstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Emmanuell GoldsteinПопробовал в постгресе сделать max_connection в 500 соединений - вылетело по "открыто максимальное количество файлов"
ну сделай чуть меньше. Но не 50 же. Сам сделал узкое горлышко и потом маемся.Я просто думаю, а зайдет 100 пользователей, 150, 200. Встанет раком!
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39117510
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Emmanuell GoldsteinЯ просто думаю, а зайдет 100 пользователей, 150, 200. Встанет раком!
Если у вас цикл запрос-ответ измеряется секундами, то раком встанет на много раньше. И дело тут совсем не в пуле соединений.
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39117575
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Emmanuell Goldstein,
не знаю, как твоя БД, а оракле выдержит и 1000 соединений _корпоративе_.
Есть веб-приложения, есть десктоп, есть сайты визитки. Есть OLAP\OLTP.
Ни у кого раком не встаёт, и у всех по разному.
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39117578
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Emmanuell Goldstein,
анализируй нагрузку по ТЗ + тесты.
А потом конкретно можно.
Удачи!
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39117636
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123не знаю, как твоя БД, а оракле выдержит и 1000 соединений _корпоративе_.На сравнимых доступных ресурсах все могут "тысячу соединений выдержать".
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39117645
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Emmanuell GoldsteinКогда проводим нагрузочное тестирование с Apache JMeter, при 50 пользователях выедается весь коннекшн-пул1. Что конкретно делают ваши запросы?
2. Соединение должно возвращаться в пул не "сразу же", а "тогда, когда оно больше не требуется". А это возвращает нас к первому вопросу.
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39117676
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,
если так, и в ТЗ стоит макс в пике = 1000, то и сабж не имеет смысла. Ставить на 1000 и всё.
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39117683
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123если так, и в ТЗ стоит макс в пике = 1000, то и сабж не имеет смысла. Ставить на 1000 и всё."Сдуру можно и член сломать. Даже если он дубовый".
В моей практике было три аварийных останова с одинаковыми симптомами - конкуренция на обновлениях строк одной из таблиц и сопутствующая конкуренция за блокировки кэша запросов. И всё это - задолго до исчерпания лимита подключений.
А всё потому, что разработчики вместо "подумать" - воткнули шаблонный код.
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39121034
andrej59
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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();
}
}
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39121055
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrej59Судя по вашему, описания вы считаете что контейнерОн не считает, он знает , что всю работу сделает try-with-resource .
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39121182
drsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Emmanuell GoldsteinПопробовал в постгресе сделать max_connection в 500 соединений - вылетело по "открыто максимальное количество файлов"
ну сделай чуть меньше. Но не 50 же. Сам сделал узкое горлышко и потом маемся.

Emmanuell Goldstein,
postgres ОЧЕНЬ не любит высокий max_connections.

выходы:
1) настроить pgbouncer перед базой
2) использовать это https://github.com/brettwooldridge/HikariCP
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39121198
uid unique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
} finally {
    try {
     res.close();
    } catch(Exception ex) {
      //log
    }
     try {
     connection.close();
     } catch(Exception ex) {
        //log
    }   
}
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39121199
uid unique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
} finally {
    try {
     res.close();
    } catch(Exception ex) {
      //log
    }
     try {
     connection.close();
     } catch(Exception ex) {
        //log
    }   
}


Отбой, это же try-with-resources. Пора спать.
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39121255
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drsmEmmanuell Goldstein,
postgres ОЧЕНЬ не любит высокий max_connections.
запостите это на ветку СУБД, раз админа нету.
Я в первой ссылке поиска нашёл для вас РАБОЧЕЕ значение параметра - 500 соединений.
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39121291
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНастроить инспекции кода, которые не дадут сбилдить проект, если кто-то провтыкал закрыть JDBC ресурс.

Blazkowicz, а можно какую нибудь ссылку, где об этом можно почитать понятным языком? Сейчас новый проект, было бы классно в самом начале такую фичу настроить.

Заранее спасибо.
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39121329
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevBlazkowicz, а можно какую нибудь ссылку, где об этом можно почитать понятным языком? Сейчас новый проект, было бы классно в самом начале такую фичу настроить.

http://findbugs.sourceforge.net/
...
Рейтинг: 0 / 0
100 коннектов к СУБД на J2EE
    #39121853
uid unique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovEmmanuell GoldsteinКогда проводим нагрузочное тестирование с Apache JMeter, при 50 пользователях выедается весь коннекшн-пул1. Что конкретно делают ваши запросы?
2. Соединение должно возвращаться в пул не "сразу же", а "тогда, когда оно больше не требуется". А это возвращает нас к первому вопросу. Так оно не требуется как только ему close() вызвали - этим дается знать обертке (Connection) что можно вернуть соединение в пул. Вопрос еще как пул отработает.
Попробуйте простой мониторинг сколько у вас соединений висит со стороны Java - добавьте счетчик в try/finally либо сделайте простую обертку для Connection и перекройте close() (статический счетчик + в конструкторе и - в сlose() и вывод в лог) и посмотрите сколько ваш код соединений использует. Проверьте со стороны базы сколько соединений/сессий висит открытыми. Если со стороны Java все ОК, а со стороны базы соединений много больше и они растут со временем, значит тупит пул на клиенте (похожие проблемы как то были - соединения закрывались со стороны Java но рос лист активных соединений, потом база валилась при созданиий нового соединения - если короче, пул проверялся и не чистился, соединения висели как активные и не переносились в лист неиспользуемых соединений). Поменяли реализацию пула и все пошло нормально работать.
Дополнительно посмотрите настойки клиентского пула - интервалы, лимиты, локирует ли он вызовы из Java и на какое время если лимит на создание соединений исчерпан.
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / 100 коннектов к СУБД на J2EE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]