Могу ли я изменить максимальный размер пула для соединений, и что определяет, что мне следует установить? - PullRequest
3 голосов
/ 01 марта 2009

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

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

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

Ответы [ 4 ]

5 голосов
/ 01 марта 2009

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

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

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

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

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

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

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

2 голосов
/ 01 марта 2009

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

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

2 голосов
/ 01 марта 2009

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

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

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

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

0 голосов
/ 01 марта 2009

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

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

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

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

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

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

Удачи!

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