Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基础知识-解决Hibernate/JDBC连接池问题_Java_Hibernate_Jdbc_Connection Pooling - Fatal编程技术网

Java 基础知识-解决Hibernate/JDBC连接池问题

Java 基础知识-解决Hibernate/JDBC连接池问题,java,hibernate,jdbc,connection-pooling,Java,Hibernate,Jdbc,Connection Pooling,对于从底层连接池获得的数据库连接,Hibernate的职责是什么。它是否在使用连接之前测试连接是否已关闭?如果是这样,从池中获取另一个连接 我在下面包含了错误和确认信息。任何关于我可以从哪里开始解决这个问题的想法都会非常有帮助。以及有关我们正在使用的SQL Server驱动程序设置的任何建议 来自Catalina日志: 04-Nov-2010 21:54:52.691 WARNING org.apache.tomcat.jdbc.pool.ConnectionPool.abandon Conne

对于从底层连接池获得的数据库连接,Hibernate的职责是什么。它是否在使用连接之前测试连接是否已关闭?如果是这样,从池中获取另一个连接

我在下面包含了错误和确认信息。任何关于我可以从哪里开始解决这个问题的想法都会非常有帮助。以及有关我们正在使用的SQL Server驱动程序设置的任何建议

来自Catalina日志:

04-Nov-2010 21:54:52.691 WARNING org.apache.tomcat.jdbc.pool.ConnectionPool.abandon Connection has been abandoned PooledConnection[ConnectionID:8]:java.lang.Exception at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:926) at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:681) at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:545) at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:166) at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:106) 2010-11-04 21:54:52,705 [tomcat-http--18] WARN util.JDBCExceptionReporter - SQL Error: 0, SQLState: 08S01 2010-11-04 21:54:52,707 [tomcat-http--18] ERROR util.JDBCExceptionReporter - Socket closed 2010-11-04 21:54:52,708 [tomcat-http--18] ERROR transaction.JDBCTransaction - JDBC rollback failed java.sql.SQLException: Connection has already been closed. at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:112) at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:94) at org.apache.tomcat.jdbc.pool.interceptor.AbstractCreateStatementInterceptor.invoke(AbstractCreateStatementInterceptor.java:71) at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:94) at org.apache.tomcat.jdbc.pool.interceptor.ConnectionState.invoke(ConnectionState.java:132) at $Proxy38.rollback(Unknown Source) at org.hibernate.transaction.JDBCTransaction.rollbackAndResetAutoCommit(JDBCTransaction.java:217) at org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:196) at org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:676) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:845) at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:822) at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:412) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:111) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625) 2010年11月4日21:54:52.691警告org.apache.tomcat.jdbc.pool.ConnectionPool.放弃连接已被放弃PooledConnection[连接ID:8]:java.lang.Exception 位于org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:926) 位于org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:681) 位于org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:545) 位于org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:166) 位于org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:106) 从我们的应用程序日志:

04-Nov-2010 21:54:52.691 WARNING org.apache.tomcat.jdbc.pool.ConnectionPool.abandon Connection has been abandoned PooledConnection[ConnectionID:8]:java.lang.Exception at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:926) at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:681) at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:545) at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:166) at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:106) 2010-11-04 21:54:52,705 [tomcat-http--18] WARN util.JDBCExceptionReporter - SQL Error: 0, SQLState: 08S01 2010-11-04 21:54:52,707 [tomcat-http--18] ERROR util.JDBCExceptionReporter - Socket closed 2010-11-04 21:54:52,708 [tomcat-http--18] ERROR transaction.JDBCTransaction - JDBC rollback failed java.sql.SQLException: Connection has already been closed. at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:112) at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:94) at org.apache.tomcat.jdbc.pool.interceptor.AbstractCreateStatementInterceptor.invoke(AbstractCreateStatementInterceptor.java:71) at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:94) at org.apache.tomcat.jdbc.pool.interceptor.ConnectionState.invoke(ConnectionState.java:132) at $Proxy38.rollback(Unknown Source) at org.hibernate.transaction.JDBCTransaction.rollbackAndResetAutoCommit(JDBCTransaction.java:217) at org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:196) at org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:676) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:845) at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:822) at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:412) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:111) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625) 2010-11-04 21:54:52705[tomcat http--18]WARN util.jdbceptionReporter-SQL错误:0,SQLState:08S01 2010-11-04 21:54:52707[tomcat http--18]错误util.jdbceptionReporter-套接字已关闭 2010-11-04 21:54:52708[tomcat http--18]错误事务。JDBCTransaction-JDBC回滚失败 java.sql.SQLException:连接已关闭。 位于org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:112) 位于org.apache.tomcat.jdbc.pool.jdbceptor.invoke(jdbceptor.java:94) 位于org.apache.tomcat.jdbc.pool.interceptor.AbstractCreateStatementInterceptor.invoke(AbstractCreateStatementInterceptor.java:71) 位于org.apache.tomcat.jdbc.pool.jdbceptor.invoke(jdbceptor.java:94) 位于org.apache.tomcat.jdbc.pool.interceptor.ConnectionState.invoke(ConnectionState.java:132) 在$Proxy38.回滚(未知源) 位于org.hibernate.transaction.JDBCTransaction.rollbackandsetautocommit(JDBCTransaction.java:217) 位于org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:196) 位于org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:676) 位于org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:845) 位于org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:822) 位于org.springframework.transaction.interceptor.TransactionSpectSupport.CompleteTransactionActionAfterThrough(TransactionSpectSupport.java:412) 位于org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:111) 位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:172) 位于org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625) 配置

<Resource defaultAutoCommit="false" defaultReadOnly="false"
        defaultTransactionIsolation="SERIALIZABLE"
        driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
        fairQueue="false" initialSize="10"
        jdbcInterceptors="ConnectionState;StatementFinalizer"
        jmxEnabled="true" logAbandoned="true" maxActive="100"
        maxIdle="10" maxWait="30000"
        minEvictableIdleTimeMillis="10000" minIdle="10"
        name="com.ourcompany.ap.shoppingcart/datasource"
        password="somePassword" removeAbandoned="true"
        removeAbandonedTimeout="60" testOnBorrow="true"
        testOnReturn="false" testWhileIdle="false"
        timeBetweenEvictionRunsMillis="5000"
        type="javax.sql.DataSource"
        url="jdbc:sqlserver://approd\approd;databaseName=prod"
        useEquals="false" username="AccessPointNet"
        validationInterval="30000" validationQuery="SELECT 1"/>`
`

我过去处理过一个问题,我们没有正确地将连接返回到池中。因此,当连接被使用而未返回时,在超时时进行数据库调用会引发异常

我们可以通过调用数据库重现问题,等待8小时(postgres的默认超时),然后再次尝试调用数据库。它每次都抛出相同的异常。我们的解决方案是重新考虑(或者更好的是,添加)连接管理策略


总之,您是否真的通过关闭会话来返回到池的连接?

我们通常通过使用dbcp来解决这个问题,并在定义数据源时提供validationQuery。然后,dbcp将在将池连接返回到应用程序之前,通过发出该查询(并在连接不再工作时透明地重新创建连接)来验证池连接的可用性

退房 更多细节

对于从底层连接池获得的数据库连接,Hibernate的职责是什么

不多,在
会话关闭时释放它

它是否在使用连接之前测试连接是否已关闭?如果是这样,从池中获取另一个连接

不,Hibernate没有,如果您愿意,检查连接的有效性是连接池的责任

我在下面包含了错误和确认信息。任何关于我可以从哪里开始解决这个问题的想法都会非常有帮助

你到底在运行什么样的流程?长期交易?它超时了吗?由以下原因引起的
说明了什么?关于跟踪:

2010-11-04 21:54:52,705 [tomcat-http--18] WARN util.JDBCExceptionReporter - SQL Error: 0, SQLState: 08S01 2010-11-04 21:54:52,707 [tomcat-http--18] ERROR util.JDBCExceptionReporter - Socket closed 2010-11-04 21:54:52,708 [tomcat-http--18] ERROR transaction.JDBCTransaction - JDBC rollback failed java.sql.SQLException: Connection has already been closed. 2010-11-04 21:54:52705[tomcat http--18]WARN util.jdbceptionReporter-SQL错误:0,SQLState:08S01 2010-11-04 21:54:52707[tomcat http--18]错误util.jdbceptionReporter-套接字已关闭 2010-11-04 21:54:52708[tomcat http--18]错误事务。JDBCTransaction-JDBC回滚失败java.sql.SQLException:连接已关闭。 你能以确定性的方式重现它吗?有网络问题吗

以及有关我们正在使用的SQL Server驱动程序设置的任何建议

我在下面添加了一个关于Tomcat和连接池配置的优秀资源。但不是特定于SQL Server的

资源

我遇到了一个类似的问题,通过将RemoveBandonedTimeout值增加到一个更高的数字来解决。我们面临的问题是由于查询所花费的时间比上述超时时间要长

我目前在我的项目中使用的是
liquibase(v1.9)
,当变更集针对空白模式运行时,总是需要超过60秒的时间,这导致