Ошибка MySql возникает в одночасье - «Последний пакет, отправленный на сервер, был 0 мс назад» - PullRequest
8 голосов
/ 06 мая 2011

Я, кажется, испытываю исключение в моей заявке в одночасье.

Моя среда - это веб-приложение на Java, использующее Tomcat, написанное на Java6 и работающее на MySQL, а Hibernate3 используется для подключения к базе данных (с использованием коннектора MySQL 5.0.3 - mysql-connector-java-5.0.3-bin. банка)

Существует запланированное задание, которое выполняется в одночасье (с использованием кварца в качестве планировщика), и при запуске в 3 часа ночи при попытке доступа к базе данных оно дает следующее исключение (обратите внимание, я переименовал биты трассировки стека с помощью "xxx" «поскольку это внутренний код компании, в которой я работаю):

03:00:00 ERROR bernate.transaction.JDBCTransaction: JDBC begin failed
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.io.EOFException

STACKTRACE:

java.io.EOFException
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2304)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2803)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3118)
    at com.mysql.jdbc.Connection.setAutoCommit(Connection.java:5215)
    at org.apache.commons.dbcp.DelegatingConnection.setAutoCommit(DelegatingConnection.java:331)
    at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setAutoCommit(PoolingDataSource.java:317)
    at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:63)
    at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1326)
    at xxx.HibernateSession.beginThreadTransaction(HibernateSession.java:75)
    at xxx.HibernateSession.beginTransaction(HibernateSession.java:141)
    at xxx.TestCaseManager.runAllTestsInBackground(TestCaseManager.java:228)
    at xxx.scheduler.Job.execute(Job.java:42)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:529)


** END NESTED EXCEPTION **



Last packet sent to the server was 0 ms ago.
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2515)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2803)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3118)
    at com.mysql.jdbc.Connection.setAutoCommit(Connection.java:5215)
    at org.apache.commons.dbcp.DelegatingConnection.setAutoCommit(DelegatingConnection.java:331)
    at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setAutoCommit(PoolingDataSource.java:317)
    at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:63)
    at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1326)
    at xxx.HibernateSession.beginThreadTransaction(HibernateSession.java:75)
    at xxx.HibernateSession.beginTransaction(HibernateSession.java:141)
    at xxx.TestCaseManager.runAllTestsInBackground(TestCaseManager.java:228)
    at xxx.scheduler.Job.execute(Job.java:42)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:529)
03:00:00 ERROR bernate.transaction.JDBCTransaction: JDBC begin failed
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

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

Я проверил базу данных и могу выполнять простые SELECT для таблиц, к которым она пытается подключиться. Любая помощь будет оценена.

1 Ответ

5 голосов
/ 06 мая 2011

Ваш пул соединений DBCP истекает, используйте приведенную ниже конфигурацию ...

Простое решение состоит в том, чтобы заставить DBCP проверять соединения перед передачей их вызывающей стороне.Добавьте следующие свойства в вашу конфигурацию BasicDataSource:

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

Список всех параметров см. Здесь: http://commons.apache.org/dbcp/configuration.html

РЕДАКТИРОВАТЬ: Для незначительного исправления происходящего см. Комментарий MJB ниже.

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