org.apache.tomcat.jdbc.pool.ConnectionPool放弃

时间:2015-08-06 18:24:28

标签: mysql grails connection-pooling

环境:

  • Ubuntu 14 64位
  • tomcat 7
  • openjdk 1.7.0_79
  • mysql 5.6
  • grails 2.5(作为war文件部署的应用程序)

当我们尝试启动tomcat时,我们得到以下堆栈跟踪。它曾经工作,但现在它总是给出这个,并且无法启动:

 org.apache.tomcat.jdbc.pool.ConnectionPool abandon
WARNING: Connection has been abandoned PooledConnection[com.mysql.jdbc.JDBC4Connection@4db0ee25]:java.lang.Exception
        at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:1063)
        at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:780)
        at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:619)
        at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:188)
        at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:128)
        at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.getTargetConnection(LazyConnectionDataSourceProxy.java:403)
        at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.invoke(LazyConnectionDataSourceProxy.java:376)

context.xml包含:

<Resource name="myapp" auth="Container" type="javax.sql.DataSource"
    maxActive="100" minIdle="10" maxIdle="20" maxWait="10000"
    username="myapp" password="pass" driverClassName="com.mysql.jdbc.Driver"
      validationquery="SELECT 1;"
      testWhileIdle="true"
      testOnBorrow="true"
      testOnReturn="false"
      validationInterval="30000"
      timeBetweenEvictionRunsMillis="30000"
      initialSize="10"
      removeAbandonedTimeout="120"
      removeAbandoned="true"
      logAbandoned="true"
      minEvictableIdleTimeMillis="60000"
      jmxEnabled="true"
    url="jdbc:mysql://10.0.2.20:3306/myapp"/>

和grails数据源有这个:

dataSource {
    pooled = true
    driverClassName = "com.mysql.jdbc.Driver"
    dialect = "org.hibernate.dialect.MySQL5InnoDBDialect"
    properties {
        maxActive = -1
        minEvictableIdleTimeMillis=1800000
        timeBetweenEvictionRunsMillis=1800000
        numTestsPerEvictionRun=3
        testOnBorrow=true
        testWhileIdle=true
        testOnReturn=true
        validationQuery="SELECT 1"
    }
}

production {
    dataSource {
        pooled = false
        jndiName = "java:comp/env/myapp"
    }
}

尝试了什么:

  • minEvictableIdleTimeMillis和其他参数的很多组合,没有任何区别。
  • 为java提供更多内存和永久空间。
  • 重启mysql
  • 重启tomcat(很多)
  • 将removeabandonedtimeout增加到非常高的值。

有趣的是,我有另一台服务器完美运行,具有相同的版本和配置 - 唯一的区别是一个是使用dediserve托管的虚拟服务器,另一个是带有运行tomcat的lxc容器的物理服务器。 dediserve工作。

一个很大的线索可能是它在tomcat启动时自动运行liquibase(通过标准的grails数据库迁移插件1.4.0),并且它已正确创建了模式,但没有任何数据。

1 个答案:

答案 0 :(得分:0)

好的,找到了解决方案。基本上,liquibase需要花费很长时间才能启动,而不是已经设置的已经非常高的removeAbandonedTimeout 120s。我将其更改为1000秒并开始。