heroku cleardb插件中的连接关闭错误

时间:2014-06-04 20:20:36

标签: grails heroku

我刚刚使用cleardb插件在heroku中部署了一个非常简单的grails应用程序,一切都很好,直到过去几分钟,当我尝试获取有权访问数据库的视图时我得到了错误消息。

在这里,我粘贴了来自heroku日志的片段

2014-06-04T20:12:17.511251+00:00 app[web.1]: 2014-06-04 20:12:17,511 [http-nio-38536-exec-1] ERROR util.JDBCExceptionReporter  - No operations allowed after 
connection closed.
2014-06-04T20:12:17.515181+00:00 app[web.1]: 2014-06-04 20:12:17,514 [http-nio-38536-exec-1] ERROR errors.GrailsExceptionResolver  - EOFException occurred when processing request: [GET] /user
2014-06-04T20:12:17.515187+00:00 app[web.1]: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.. Stacktrace follows:
2014-06-04T20:12:17.515190+00:00 app[web.1]:    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3166)
2014-06-04T20:12:17.515188+00:00 app[web.1]: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.

这是我的数据源制作部分

production {
    dataSource {
      dbCreate = "update"
      driverClassName = "com.mysql.jdbc.Driver"
      dialect = org.hibernate.dialect.MySQL5InnoDBDialect
      uri = new URI(System.env.CLEARDB_DATABASE_URL?:"//bb2c98a68a13fe:3a6fd398@us-cdbr-east-06.cleardb.net/heroku_b28cc03a245469f?reconnect=true")
      url = "jdbc:mysql://"+uri.host+uri.path
      username = uri.userInfo.split(":")[0]
      password = uri.userInfo.split(":")[1]
    }
}

日志告诉我连接已关闭。我不知道该怎么办,希望你能帮助我,谢谢你的时间

1 个答案:

答案 0 :(得分:3)

我终于得到了这个问题的解决方案,感谢heroku支持团队和cleardb支持团队的帮助,解决方案是将数据源的属性添加到生产环境中,datasource.groovy中的最终代码

production {
    dataSource {
      dbCreate = "update"
      driverClassName = "com.mysql.jdbc.Driver"
      dialect = org.hibernate.dialect.MySQL5InnoDBDialect
      uri = new URI(System.env.CLEARDB_DATABASE_URL?:"//bb2c98a68a13fe:3a6fd398@us-cdbr-east-06.cleardb.net/heroku_b28cc03a245469f?reconnect=true")
      url = "jdbc:mysql://"+uri.host+uri.path
      username = uri.userInfo.split(":")[0]
      password = uri.userInfo.split(":")[1]
      properties {
        // See http://grails.org/doc/latest/guide/conf.html#dataSource for documentation
        jmxEnabled = true
        initialSize = 5
        maxActive = 50
        minIdle = 5
        maxIdle = 25
        maxWait = 10000
        maxAge = 10 * 60000
        timeBetweenEvictionRunsMillis = 5000
        minEvictableIdleTimeMillis = 60000
        validationQuery = "SELECT 1"
        validationQueryTimeout = 3
        validationInterval = 15000
        testOnBorrow = true
        testWhileIdle = true
        testOnReturn = false
        jdbcInterceptors = "ConnectionState"
        defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED
      }
    }
}

这是默认值,只是不要像我那样删除它。

这个必要的原因是在cleardb团队支持回答中,我粘贴下一个

  

6/05/2014 03:07 PM写道

     

您好,

     

我的怀疑 - 没有进一步排除故障,只是第一次通过 - 是   您的应用未正确管理连接。您当前的   数据库服务层最多允许4个同时连接   到数据库。您的应用程序可能正在尝试打开更多内容   连接比允许的。

     

如果您使用连接池,则必须确保您的池   总数不超过4(如果你的话,那就是所有的dynos)   超过1)。

     

Heroku的网络在60秒内超时空闲连接,所以你的   必须将数据库连接器设置为空闲超时为no   超过60秒,或者您必须保持较少的保持活动间隔   超过60(发送一个简单的查询,如“SELECT 1”来保持   连接活跃)。

     

我们不直接支持grails,所以我很遗憾不能给你   在这个框架内如何做到这一点的具体方向。

     

我希望这有用。

     

Mike ClearDB支持团队

我希望对某人有所帮助