我刚刚使用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]
}
}
日志告诉我连接已关闭。我不知道该怎么办,希望你能帮助我,谢谢你的时间
答案 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支持团队
我希望对某人有所帮助