Тайм-ауты MySql - я должен установить autoReconnect = true в приложении Spring? - PullRequest
3 голосов
/ 09 марта 2010

После периодов бездействия на моем веб-сайте (с использованием Spring 2.5 и MySql) я получаю следующую ошибку:

org.springframework.dao.RecoverableDataAccessException: The last packet sent successfully to the server was 52,847,830 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.

Согласно этот вопрос связанная ошибка , я не должен просто устанавливать autoReconnect = true.Означает ли это, что я должен перехватить это исключение при выполнении любых запросов и повторить транзакцию?Должна ли эта логика быть на уровне доступа к данным или на уровне модели?Есть ли простой способ справиться с этим вместо того, чтобы оборачивать каждый запрос, чтобы поймать это?

Ответы [ 3 ]

5 голосов
/ 09 марта 2010

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

Хорошим является c3p0 , но есть и другие.Spring поддерживает для этого , хотя я не знаю всех деталей. Здесь - это конфигурация DataSource для Spring.

4 голосов
/ 10 марта 2010

Это исключение может иметь 2 причины:

  1. Вы неправильно закрываете ресурсы JDBC. Все Connection, Statement и ResultSet должны быть закрыты в обратном порядке в блоке finally блока try, где они были получены. Это независимо от того, используете ли вы пул соединений или нет.

  2. Вы правильно закрываете ресурсы JDBC, но используете пул соединений с плохими настройками. Необходимо убедиться, что пул соединений не удерживает соединения открытыми дольше, чем настроенное время ожидания БД. Уменьшите одно или увеличьте другое в конфигурации.

3 голосов
/ 27 августа 2010

Нам нужно было установить следующие свойства, чтобы избежать тайм-аута даже при пуле соединений; мы используем Apache Commons DBCP.

<property name="validationQuery"> <value>SELECT 1</value>  </property>
<property name="testOnBorrow">    <value>true</value>      </property>
...