我在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。
答案 0 :(得分:3)
对于MySQL和Grails,最佳做法是在数据库池上进行验证查询。您可以附加到您的定义:
validationQuery="SELECT 1"
另见http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html#JDBC_Data_Sources