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)
新しいクエリを長時間実行していませんが、接続がプールに適切に返されないためにこれが発生したと思います...構成を試してみましたが、まれにですが、同じことが起こりました。
構成が平均的な負荷のアプリケーションに適しているかどうか、および接続プールの寿命を改善する可能性があるかどうかを知りたいだけです。
注:timeBetweenEvictionRunsMillis
とminEvictableIdleTimeMillis
を減らすと、より頻繁に発生し始めます。
どんな助けでもありがたいです。
removeAbandonedTimeout
を増やすと、問題は軽減されますが、修正はされません。この問題は、接続が適切に閉じられていないか、クエリに時間がかかりすぎていることが原因である可能性があります。
実行されるクエリを監視できるかどうかを確認し、時間を計って、正しく閉じられているかどうかを確認します。