Hibernate Grails数据库中断导致应用程序宕机

Hibernate Grails数据库中断导致应用程序宕机,hibernate,tomcat,grails,gorm,grails-2.0,Hibernate,Tomcat,Grails,Gorm,Grails 2.0,我们的应用程序运行在Grails上,我们有MS SQL数据库。我们和客户有问题。问题是他们的数据库服务器由于某种原因突然停机。这只是暂时的,通常几分钟左右就会回来。当应用程序关闭且用户尝试访问应用程序时,他们会看到以下错误: Caused by: org.hibernate.TransactionException: JDBC begin failed: at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransact

我们的应用程序运行在Grails上,我们有MS SQL数据库。我们和客户有问题。问题是他们的数据库服务器由于某种原因突然停机。这只是暂时的,通常几分钟左右就会回来。当应用程序关闭且用户尝试访问应用程序时,他们会看到以下错误:

Caused by: org.hibernate.TransactionException: JDBC begin failed:
        at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:92)
        at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473)
        at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:555)
        ... 84 more
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.
        at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed(SQLServerConnection.java:388)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.getAutoCommit(SQLServerConnection.java:
我在谷歌上找到了几个链接:

但在上述两种情况下,应用程序似乎通常在用户尝试几次后出现在UI上。然而,在我的例子中,UI从来没有出现过,我们继续看到相同的错误,尽管在把DB带回来之后。只有在重新启动grails实例(即tomcat)之后,我们才能看到应用程序返回

目前,我们的数据源配置非常先进:

dataSource {
            dialect = org.hibernate.dialect.SQLServerDialect
            driverClassName = 'com.microsoft.sqlserver.jdbc.SQLServerDriver'
            username = 'user'
            password = 'P@SSWorD'
            url = 'jdbc:sqlserver://hostName;DatabaseName=dbName;instanceName=instanceName'
            dbCreate = 'update' // Deliberately kept in update mode due to some reasons. Please advise if it has to be changed as well.
}

感谢您的帮助,因为这个问题现在正困扰着我们。

请尝试添加您链接到的堆栈溢出问题中提到的数据源属性:
testOn…
validationQuery
。另见:我当然会的,安德鲁。当我这么做的时候,你不认为这两种情况有一些不同吗?我的情况是,即使在启动SQL server之后也无法重新连接?每次我们完全重新启动grails应用程序时。因此,我认为testOn将继续测试DB可用性,并确保grails不会将应用程序长期闲置。而在我的例子中,不是空闲,而是grails无法在DB返回后重新连接。尽管如此,我还是会尝试这些选择,并让你知道。谢谢。重新连接失败可能是由于池连接导致的,而池连接由于数据库重新启动而变得无效。
testOnBorrow
pool属性将检测过时的连接,并在需要时重新连接。testOn配置非常有效!