Устаревшие соединения, validationQuery не исправляет - PullRequest
5 голосов
/ 30 января 2012

Я получаю ужасные исключения устаревшего соединения MySQL JDBC:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 243,263,541 milliseconds ago.  The last packet sent successfully to the server was 243,263,541 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

Кажется, что все согласны с тем, что это исправлено с помощью validationQuery + testOnBorrow, но это не решает проблему.

Я использую следующее программное обеспечение MySQL 5.1.41-3ubuntu12.10 Соединитель / J 5.1.18 Tomcat 6.0.24

Вот как определяется соединение в server.xml, мы используем tomcat-dbcp для объединения соединений.

 <Resource
       auth="Container"
       driverClassName="com.mysql.jdbc.Driver"
       factory="org.apache.commons.dbcp.BasicDataSourceFactory"
       logAbandoned="true"
       maxActive="75"
       maxIdle="20"
       maxWait="10000"
       name="jdbc/jndiname"
       password="password"
       removeAbandoned="true"
       removeAbandonedTimeout="60"
       validationQuery="/* ping */SELECT 1"
       testOnBorrow="true"
       testOnReturn="true"
       timeBetweenEvictionRunsMillis="10000"
       testWhileIdle="true"
       scope="Shareable"
       type="javax.sql.DataSource"
       url="jdbc:mysql://host:3306/schema"
       username="username" />

Ответы [ 3 ]

0 голосов
/ 26 августа 2015

Ваш запрос на проверку неверен. Уберите «select 1» и оставьте только ping.

0 голосов
/ 26 июля 2016

В my.cnf вашего mysql установите для следующих свойств большое значение, например 365 дней -

wait_timeout = 31536000interactive_timeout = 31536000

Значение сеанса wait_timeout будет инициализировано глобальным значением wait_timeout для неинтерактивных подключений и глобальным значением interactive_timeout для интерактивных подключений.

PS- Оба значения указаны в секундах.

0 голосов
/ 30 января 2012

Я мог бы проверить wait_timeout в вашем файле my.cnf.По умолчанию это 28800 секунд или 8 часов.Максимальное время - 31536000 секунд или 365 дней.

Для первого исключения, которое вы заметили: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException, в прошлом я заключил его в блок try / catch.В этом улове, за исключением этого, я переподключил соединение, а затем снова отправил запрос.Зная, что я не хочу делать это очень часто и по-прежнему поддерживаю открытое соединение, я также увеличил значение по умолчанию wait_timeout до чего-то приемлемого для моего приложения.

См. Справочник по адресу: http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_wait_timeout

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