Возникла проблема с 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
Выполняем скрипт с параметром имени пула: ./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 :)
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 :)
Комментариев нет:
Отправить комментарий