Grails在失败时自动重新打开连接

时间:2016-01-22 15:00:28

标签: hibernate grails jdbc ingres

我有一个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
}

3 个答案:

答案 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',或者供应商特定值可能是什么)。

也许主要的焦点应该是在应用程序级别上指出数据库崩溃的原因。在应用程序运行时重新启动数据库服务器是不好的做法。