【问题标题】:Grails / Tomcat: Database connections get stuck in sleep stateGrails / Tomcat:数据库连接陷入睡眠状态
【发布时间】:2013-03-11 12:44:12
【问题描述】:

我有一个在 Tomcat 7 下运行的 Grails 应用程序,但在管理 MySQL 连接时遇到问题。

问题是对应用程序的每个新请求(即页面加载)都在创建一个新的 MySQL 连接,而这些连接没有关闭。相反,它们保持在 SLEEP 状态,直到 MySQL 服务器最终拒绝接受更多连接。因此,只需快速重新加载站点上的各个页面,就可以创建大量数据库连接。

看来我的连接池没有足够快地关闭与 MySQL 的连接。连接池有许多配置设置,但我不确定需要调整什么来避免这个问题。

这是我的 context.xml 文件中的配置:

        <Resource name="jdbc/Production" auth="Container" type="javax.sql.DataSource"
            maxActive="100"
            maxIdle="30"
            maxWait="10000"
            minEvictableIdleTimeMillis="1800000"
            timeBetweenEvictionRunsMillis="1800000"
            numTestsPerEvictionRun="3"
            removeAbandoned="true"
            removeAbandonedTimeout="60"
            logAbandoned="true"
            testOnBorrow="true"
            testWhileIdle="true"
            testOnReturn="true"
            validationQuery="SELECT 1"
            username=""
            password=""
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost/Production"
    />

非常感谢您的任何建议。

【问题讨论】:

    标签: mysql tomcat grails


    【解决方案1】:

    您没有定义连接池。

    在context.xml中加入如下代码(好像是JNDI数据源):

    pooled = "true"
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
    

    如果您还没有将 JDBC Pool 放入依赖项配置中,请将以下内容添加到 BuildConfig.groovy 中的 plugins 闭包中:

    compile ":jdbc-pool:1.0.9.3"
    

    您可以使用其他连接池,但我建议使用 JDBC 池。

    【讨论】:

    • 我尝试按照您的建议添加 JDBC 池插件。但是,我仍然看到相同的行为,当网站上的任何页面被快速刷新时,会创建多个 MySQL 连接。连接最终会消失,但只有在服务器上的负载增加到如此之高以至于无法使用之后。您对如何调试此行为有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多