Tomcat, Hibernate и исключение java.io.EOFException - PullRequest
5 голосов
/ 29 мая 2010

Мое Java-приложение, которое использует Hibernate и размещено на Tomcat 6.0, получает следующее исключение после долгого простоя при попытке доступа к БД:

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:1963)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2375)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2874)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1403)
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1812)
    at org.hibernate.loader.Loader.doQuery(Loader.java:697)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
    at org.hibernate.loader.Loader.doList(Loader.java:2232)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129)
    at org.hibernate.loader.Loader.list(Loader.java:2124)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1149)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)

Какие-нибудь советы?

Спасибо

1 Ответ

3 голосов
/ 29 мая 2010

MySQL закроет свободные соединения через 8 часов по умолчанию (wait_timeout). Это «известная проблема», и вы найдете много ссылок на нее в Интернете, например эта . Так что либо:

  • настроить tomcat для тестирования соединений по заимствованию, используя validationQuery в конфигурации источника данных:

    <parameter>
      <name>validationQuery</name>
      <value>select 1</value>
    </parameter>
    
  • увеличить MySQL wait_timeout с помощью my.cnf/my.ini, либо путем подключения к клиенту командной строки SQL и ввода SET GLOBAL wait_timeout=86400, либо другого подходящего количества секунд.

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

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