Могу ли я изменить максимальный размер пула для подключений и что определяет, что мне следует установить?

Обнаружена следующая ошибка в нашем приложении J2EE:

java.sql.SQLException: ошибка при выделении соединения. Причина: используемые соединения равны максимальному размеру пула и истекшему максимальному времени ожидания. Невозможно выделить больше подключений.

Как узнать, сколько подключений приложение использует в настоящее время и каковы должны быть оптимальные настройки пула подключений для приложения с интенсивным трафиком? Могу ли я изменить его и как определить, что мне следует установить (проблема с памятью, пропускной способностью и т. Д.)?

Ответов (4)

Как узнать, сколько соединений в данный момент использует приложение

Вы не даете достаточно информации, чтобы ответить на этот вопрос. Большинство серверов приложений будут иметь своего рода JMX-отчеты о подобных вещах. В качестве альтернативы, в зависимости от базы данных, вы можете узнать количество открытых в данный момент подключений.

какими должны быть оптимальные настройки пула соединений для приложения с интенсивным трафиком

Выше, чем у тебя?

Вышеизложенное, конечно, предполагает, что вы не ошибаетесь с подключениями. Под этим я подразумеваю, что если вы используете их непосредственно в коде, вы всегда должны использовать эту идиому:

Connection conn = null;
try {
  conn = ... ; // get connection
  // do stuff
} finally {
  if (conn != null) try { conn.close(); } catch (Exception e) { }
}

Если вы не освободили соединения обратно в пул и ждете, пока сборщик мусора очистит их и освободит, вы собираетесь использовать гораздо больше соединений, которые вам действительно нужны.

Вы уверены, что закрываете все необходимое? Взгляните сюда .

Убедитесь, что закрытие происходит в блоке finally. Вы увидите этот код по ссылке:

finally 
{
   closeAll(resultSet, statement, connection);
}

Я помог кому-то другому найти аналогичную проблему (вместо этого у них была проблема с памятью ... но если бы процесс продолжался дольше, у него был бы такой результат), когда они не закрыли набор результатов или соединение.

Я думаю, вам, возможно, придется проверить, задайте себе несколько вопросов, вот над чем стоит подумать:

A. Правильно ли вы используете свои соединения, закрываете ли вы их и возвращаете в пул после использования?

Б. Используете ли вы длительные транзакции, например «разговоры» с пользователями? Могут ли они остаться висящими, если пользователь прекращает использование приложения?

C. Разработали ли вы доступ к данным, чтобы он соответствовал вашему приложению? Например, используете ли вы методы кэширования в тех областях, где вы ожидаете частого повторения чтения?

D. Достаточно ли велик ваш пул подключений? 5 лет назад у меня было приложение с 250 одновременными подключениями к базе данных Oracle, что намного больше, чем то, что вы обычно находите «из коробки». запуск приложения, скажем, 50, не сработал.

Чтобы дать более подробный ответ, вам необходимо предоставить дополнительную информацию о приложении.

Удачи!

Первое, что нужно проверить, - есть ли у вас утечки ресурсов. Попробуйте выполнить наблюдение с помощью jconsole или jvisualvm, чтобы увидеть, как ведет себя ваше приложение, и есть ли что-нибудь, что бросается в глаза.

Тогда фактическое соединение пула jdbc по своей сути зависит от контейнера Java EE, поэтому вам нужно предоставить дополнительную информацию.