Приложение Grails, похоже, содержит ссылку на устаревшее соединение с БД.

Обновление: компания Rackspace ответила мне и сообщила, что их облако MySQL использует значение wait_timeout, равное 120 секундам.

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

util.JDBCExceptionReporter  - SQL Error: 0, SQLState: 08S01
util.JDBCExceptionReporter  - Communications link failure
The last packet successfully received from the server was 264,736 milliseconds 
ago. The last packet sent successfully to the server was 32 milliseconds ago.

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

Тот факт, что это соединение в последний раз получило пакет от сервера 264 секунды назад, показательно, потому что это намного превышает 120-секундный тайм-аут, установленный Rackspace. Я также подтвердил со стороны БД, что мой 30-секундный лимит соблюдается.

Вещи, которые я пробовал

  • Настройка DBCP для агрессивного истечения соединений через 30 секунд и проверка того, что экземпляр MySQL отражает это поведение через SELECT * FROM PROCESSLIST
  • Переключенная строка подключения с имени хоста на IP-адрес, так что это не проблема DNS.
  • Различные комбинации настроек подключения
  • Пытался объявить настройки пула соединений в DataSources.groovy или resources.groovy, но я уверен, что настройки соблюдаются, поскольку БД их отражает: все, что превышает 30 секунд, быстро уничтожается

Любые идеи?

Прямо сейчас я думаю, что что-то в Grails удерживает ссылку на устаревшее соединение достаточно долго, чтобы ограничение в 120 секунд было проблематичным... но это отчаянная теория, и на самом деле я сомневаюсь, что она верна, но это оставляет меня за пределами идеи.

Последняя конфигурация, которую я пробовал:

dataSource {
    pooled = true
    driverClassName = "com.mysql.jdbc.Driver"
    dialect = 'org.hibernate.dialect.MySQL5InnoDBDialect'
    properties {
        maxActive = 50
        maxIdle = 20
        minIdle = 5 
        maxWait = 10000
        initialSize = 5
        minEvictableIdleTimeMillis = 1000 * 30
        timeBetweenEvictionRunsMillis = 1000 * 5
        numTestsPerEvictionRun = 50
        testOnBorrow = true
        testWhileIdle = true
        testOnReturn = true
        validationQuery = "SELECT 1"
    }
}

Трассировки стека:

2012-10-25 12:36:12,375 [http-bio-8080-exec-2] WARN  util.JDBCExceptionReporter  - SQL Error: 0, SQLState: 08S01
2012-10-25 12:36:12,375 [http-bio-8080-exec-2] ERROR util.JDBCExceptionReporter  - Communications link failure

The last packet successfully received from the server was 264,736 milliseconds ago.  The last packet sent successfully to the server was 32 milliseconds ago.
2012-10-25 12:36:12,433 [http-bio-8080-exec-2] ERROR errors.GrailsExceptionResolver  - EOFException occurred when processing request: [GET] /cart
Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.. Stacktrace follows:
org.hibernate.exception.JDBCConnectionException: could not execute query
at grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:1531)
at SsoRealm.hasRole(SsoRealm.groovy:30)
at org.apache.shiro.grails.RealmWrapper.hasRole(RealmWrapper.groovy:193)
at org.apache.shiro.authz.ModularRealmAuthorizer.hasRole(ModularRealmAuthorizer.java:374)
at org.apache.shiro.mgt.AuthorizingSecurityManager.hasRole(AuthorizingSecurityManager.java:153)
at org.apache.shiro.subject.support.DelegatingSubject.hasRole(DelegatingSubject.java:225)
at ShiroSecurityFilters$_closure1_closure4_closure6.doCall(ShiroSecurityFilters.groovy:98)
at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195)
at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
at org.apache.shiro.grails.SavedRequestFilter.doFilter(SavedRequestFilter.java:55)
at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:380)
at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 264,736 milliseconds ago.  The last packet sent successfully to the server was 32 milliseconds ago.
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3589)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3478)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4019)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2683)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2144)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2310)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
... 20 more
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3039)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3489)
... 29 more

person Richard Marr    schedule 25.10.2012    source источник


Ответы (1)


Разобрался с этим. Плагин grails-elasticsearch удерживал устаревшие соединения. Это была известная проблема в этом плагине и исправление пришло через этот запрос на включение:

person Richard Marr    schedule 17.12.2012