web-dev-qa-db-ja.com

Tomcat7 JDBC接続プール->接続が破棄されました

JDBC接続プールの次の構成があります

initialSize="2"
minIdle="10"
maxIdle="50"
maxActive="100"
maxWait="15000"
jdbcInterceptors="org.Apache.Tomcat.jdbc.pool.interceptor.ConnectionState;org.Apache.Tomcat.jdbc.pool.interceptor.StatementFinalizer;org.Apache.Tomcat.jdbc.pool.interceptor.ResetAbandonedTimer"
removeAbandoned="true"
removeAbandonedTimeout="60"
logAbandoned="true"
testOnBorrow="true"
testOnReturn="true"
testWhileIdle="true"
useEquals="false"
fairQueue="false"
timeBetweenEvictionRunsMillis="300000"
minEvictableIdleTimeMillis="300000"
validationInterval="10000"
validationQuery="SELECT 1"

アプリケーションは標準のJava + Spring + Hibernate環境であり、データベースはPostgreSQLです。私はしばらくこれらの設定を使用しており、すべてが問題ありませんでした...

最近、次の例外が発生し始めました

Sep 10, 2015 5:25:57 PM org.Apache.Tomcat.jdbc.pool.ConnectionPool abandon
    WARNING: Connection has been abandoned PooledConnection[org.postgresql.jdbc4.Jdbc4Connection@3eb948ed]: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.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.Java:70)
        at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.Java:301)
        at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.Java:214)
        at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.Java:157)
        at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.Java:67)
        at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.Java:160)
        at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.Java:1351)
        at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.Java:59)
        at org.springframework.orm.jpa.DefaultJpaDialect.beginTransaction(DefaultJpaDialect.Java:67)
        at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.Java:110)
        at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.Java:380)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.Java:373)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.Java:420)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.Java:257)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.Java:95)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.Java:179)
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.Java:644)

10 Sep 2015 17:25:57,591 WARN  org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 0, SQLState: 08006
10 Sep 2015 17:25:57,592 ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - An I/O error occurred while sending to the backend.
javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: could not extract ResultSet
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.Java:1387)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.Java:1310)
    at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.Java:316)
    at com.mysema.query.jpa.impl.AbstractJPAQuery.getSingleResult(AbstractJPAQuery.Java:219)
    at com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult(AbstractJPAQuery.Java:295)
    at com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult(AbstractJPAQuery.Java:281)
    at com.mysema.query.support.ProjectableQuery.singleResult(ProjectableQuery.Java:75)

新しいクエリを長時間実行していませんが、接続がプールに適切に返されないためにこれが発生したと思います...構成を試してみましたが、まれにですが、同じことが起こりました。

構成が平均的な負荷のアプリケーションに適しているかどうか、および接続プールの寿命を改善する可能性があるかどうかを知りたいだけです。

注:timeBetweenEvictionRunsMillisminEvictableIdleTimeMillisを減らすと、より頻繁に発生し始めます。

どんな助けでもありがたいです。

1
vtor

removeAbandonedTimeoutを増やすと、問題は軽減されますが、修正はされません。この問題は、接続が適切に閉じられていないか、クエリに時間がかかりすぎていることが原因である可能性があります。

実行されるクエリを監視できるかどうかを確認し、時間を計って、正しく閉じられているかどうかを確認します。

3
Navigatron