代码之家  ›  专栏  ›  技术社区  ›  Kaleb Brasee

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

  •  1
  • Kaleb Brasee  · 技术社区  · 14 年前

    我有几个Grails 1.3.3应用程序在Tomcat 6.0.18上运行。我知道在使用默认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"
            }
        }
    }
    

    这个 只有 我知道这两种情况的区别是工作应用程序使用MyISAM表,而非工作应用程序使用InnoDB表。有没有人遇到过InnoDB和Tomcat连接池的问题?如果我找不到其他可以尝试的东西,我可以试着转到MyISAM。

    1 回复  |  直到 14 年前
        1
  •  3
  •   Stefan Armbruster    14 年前

    对于MySQL和Grails,最好对db池进行验证查询。您可以将以下内容附加到定义中:

    validationQuery="SELECT 1"
    

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