即使使用JNDI,Grails / Tomcat / MySQL陈旧连接错误?

时间:2010-11-16 14:01:10

标签: tomcat grails jdbc jndi

我在Tomcat 6.0.18上运行了几个Grails 1.3.3应用程序。我知道使用默认Grails数据源时的数据库连接失效问题(连接在一段时间不活动后被杀死),所以我切换到Tomcat提供的JNDI。

我部署的第一个应用程序从未遇到过任何陈旧的数据库连接问题。现在我使用相同的JNDI数据源配置将第二个应用程序部署到同一服务器,并且第一个应用程序继续正常工作,第二个应用程序在大约8个小时不活动后获取连接超时错误。 (错误之后,连接被刷新,并且它再次正常工作)

数据源在Tomcat的context.xml中定义如下:

<Resource name="jdbc/firstDs" auth="Container" type="javax.sql.DataSource"
        maxActive="100" maxIdle="30" maxWait="10000"
        username="user1" password="password1" driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/firstApp" />

<Resource name="jdbc/secondDs" auth="Container" type="javax.sql.DataSource"
    maxActive="100" maxIdle="30" maxWait="10000"
    username="user2" password="password2" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/secondApp" />

两个应用程序都使用Datasource.groovy文件中的JNDI数据源,如下所示(除了jndiName之外,一切都完全相同):

dataSource {
    pooled = false
}
...
environments {
    ...
    production {
        dataSource {
            dbCreate = "update"
            jndiName = "java:comp/env/jdbc/firstApp"
        }
    }
}

我明白这两种情况之间的 ONLY 差异在于工作应用程序使用MyISAM表,而非工作应用程序使用InnoDB表。有没有人遇到过InnoDB和Tomcat连接池的问题?如果我找不到其他任何可以尝试的话,我可能会尝试切换到MyISAM。

1 个答案:

答案 0 :(得分:3)

对于MySQL和Grails,最佳做法是在数据库池上进行验证查询。您可以附加到您的定义:

validationQuery="SELECT 1"

另见http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html#JDBC_Data_Sources