вторник, 14 апреля 2015 г.

GlassFish: Socket read timed out, Connection Pool error

Возникла проблема с GlassFish - в произвольное время в лог падает ошибка:

ERROR] user1 DesktopServlet: Исключение ввода/вывода: Socket read timed out
java.sql.SQLException: Исключение ввода/вывода: Socket read timed out
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)


после этого в логах куча ошибок типа:

java.lang.reflect.UndeclaredThrowableException
at $Proxy135.prepareCall(Unknown Source)
at com.megafon.hyperion.lego.database.DataManagerImpl.setUserID(DataManagerImpl.java:204)

В результате коннекты к базе зависают, переполняется Connection Pool и приложение больше не работают.

В данной ситуации помогает операция Flush:
- Заходим в админку GlassFish -> Resources -> JDBC -> JDBC Connection Pools -> заходим в наш пул. Сверху в ряд идут кнопки Load Defaults, Ping и наша Flush.
- более быстрый вариант: запускаем утилиту asadmin, выполняем команду
 flush-connection-pool Pool_Name, вводим пароли и тд.

или пишем небольшой скрипт для Cygwin/Bash:
flush.sh
#!/bin/bash
/cygdrive/e/glassfish3/bin/asadmin.bat --interactive=false --port ADMIN_PORT --passwordfile 'path_to_passwd_file\password_file.txt' --user admin  <<EOF
flush-connection-pool "$1"
exit
EOF

Выполняем скрипт с параметром имени пула: ./flush.sh Pool_Name

Но это полностью не решает нашу проблему.

В админке GlassFish имеется настройка "Connection Validation" для проверки соединения с базой Oracle.
Включаем проверку соединений: Заходим в админку GlassFish -> Resources -> JDBC -> JDBC Connection Pools -> Pool_Name, закладка Advanced, в самом низу страницы выставляем параметры:
- Validation Method - auto-commit (сначала ставим этот параметр, т.к по умолчанию стоит метод Table и при включении следующего параметра происходит соединение с базой и чтение таблиц)
- Connection Validation - Required
- On Any Failure - Close All Connections

Теперь, при операциях, требующих соединения с базой Oracle, происходит проверка связи с сервером. При возникновении проблем будут сброшены все подключения и заново проинициализированы.

Зависания коннектов и переполнения Connection Pool прекратились.

Так же можно включить опцию проверки "утекших соединений", там же в закладке Advanched настраиваем параметры:
Leak Timeout: Интервал проверки соединений
Leak Reclaim: Утекшее соединение будет утилизировано в соответствии с предыдущим параметром.

Если статья была вам полезна - кликните на баннер или кнопку Donate :)

Популярные сообщения