我有一个Grails应用程序通过域类与ingres数据库通信。当数据库崩溃或我在应用程序运行时重新启动它时,我得到一个异常:
| Error Caused by: java.sql.SQLTransactionRollbackException: Connection failed.
当我访问数据库时,每次都会出现此异常,而数据库又会从重启/崩溃中再次返回。
如何强制Grails / Hibernate重新创建连接或将其设置为自动重新创建。
这是我的配置:
dataSource {
dbCreate = 'validate'
url = "jdbc:ingres://xxx.xxx.xxx.xxx:II7/test"
driverClassName = "com.ingres.jdbc.IngresDriver"
username = "ingres"
password = "ingres"
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 = true
jdbcInterceptors = "ConnectionState"
defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED
}
答案 0 :(得分:1)
查看autoReconnect参数:
dataSource {
url = "jdbc:mysql://localhost/databaseName?useUnicode=yes&characterEncoding=UTF-8&autoReconnect=true"
}
另一个可能有用的属性:
dataSource {
pooled = true
driverClassName = "com.mysql.jdbc.Driver"
username = "secret"
password = "santa"
properties {
maxActive = 50
maxIdle = 25
minIdle = 1
initialSize = 1
numTestsPerEvictionRun = 3
maxWait = 10000
testOnBorrow = true
testWhileIdle = true
testOnReturn = true
validationQuery = "select now()"
minEvictableIdleTimeMillis = 1000 * 60 * 5
timeBetweenEvictionRunsMillis = 1000 * 60 * 5
}
}
答案 1 :(得分:1)
经过数小时的搜索并错过了关键信息后,问题很容易解决。
在我的问题的初始配置中,数据源设置周围没有properties {..}
组。天才Grails配置管理并没有警告我需要它。添加它,一切正常,GORM可以从丢失的连接中恢复。
答案 2 :(得分:0)
java.sql.SQLTransactionRollbackException
表示由于死锁或其他事务序列化失败,数据库会自动回滚可能导致数据库崩溃的最后一条语句。
重新启动无法解决此问题,可能是驱动程序特定问题。似乎SQLState
没有被重置(可能仍然包含值'40',或者供应商特定值可能是什么)。
也许主要的焦点应该是在应用程序级别上指出数据库崩溃的原因。在应用程序运行时重新启动数据库服务器是不好的做法。