`

C3P0配置错误导致的连接关闭问题

    博客分类:
  • c3p0
 
阅读更多

错误日志:

java.sql.SQLException: Invalid state, the PreparedStatement object is closed.
	at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.checkOpen(JtdsPreparedStatement.java:186)
	at net.sourceforge.jtds.jdbc.JtdsStatement.getConnection(JtdsStatement.java:1204)
	at net.sourceforge.jtds.jdbc.JtdsResultSet.getConnection(JtdsResultSet.java:441)
	at net.sourceforge.jtds.jdbc.JtdsResultSet.close(JtdsResultSet.java:502)
	at org.hibernate.jdbc.AbstractBatcher.closeQueryStatement(AbstractBatcher.java:206)
	at org.hibernate.loader.Loader.doQuery(Loader.java:726)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
	at org.hibernate.loader.Loader.doList(Loader.java:2213)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
	at org.hibernate.loader.Loader.list(Loader.java:2099)
	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
  ...
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
  ...
	at java.lang.Thread.run(Thread.java:595)
WARN Thread-9 org.hibernate.jdbc.AbstractBatcher - exception clearing maxRows/queryTimeout
java.sql.SQLException: Invalid state, the Connection object is closed.
	at net.sourceforge.jtds.jdbc.ConnectionJDBC2.checkOpen(ConnectionJDBC2.java:1659)
	at net.sourceforge.jtds.jdbc.ConnectionJDBC2.commit(ConnectionJDBC2.java:2037)
	at org.hibernate.transaction.JDBCTransaction.commitAndResetAutoCommit(JDBCTransaction.java:139)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:115)
	at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:606)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:709)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:678)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
	...
	at java.lang.Thread.run(Thread.java:595)

 

C3P0配置:

c3p0.unreturnedConnectionTimeout=180
c3p0.debugUnreturnedConnectionStackTraces=true

c3p0.maxConnectionAge=3600
c3p0.maxIdleTimeExcessConnections=60

 

放开C3P0的日志:

DEBUG C3P0PooledConnectionPoolManager[identityToken->2y6gb88w1p7nwbl1bqakad|8c5488]-AdminTaskTimer com.mchange.v2.resourcepool.BasicResourcePool - BEGIN check for expired resources.  [com.mchange.v2.resourcepool.BasicResourcePool@9ac272]
DEBUG C3P0PooledConnectionPoolManager[identityToken->2y6gb88w1p7nwbl1bqakad|8c5488]-AdminTaskTimer com.mchange.v2.resourcepool.BasicResourcePool - Removing expired resource: com.mchange.v2.c3p0.impl.NewPooledConnection@b7a60f [com.mchange.v2.resourcepool.BasicResourcePool@9ac272]
INFO C3P0PooledConnectionPoolManager[identityToken->2y6gb88w1p7nwbl1bqakad|8c5488]-AdminTaskTimer com.mchange.v2.resourcepool.BasicResourcePool - A checked-out resource is overdue, and will be destroyed: com.mchange.v2.c3p0.impl.NewPooledConnection@b7a60f
INFO C3P0PooledConnectionPoolManager[identityToken->2y6gb88w1p7nwbl1bqakad|8c5488]-AdminTaskTimer com.mchange.v2.resourcepool.BasicResourcePool - Logging the stack trace by which the overdue resource was checked-out.
java.lang.Exception: DEBUG STACK TRACE: Overdue resource check-out stack trace.
	at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:555)
	at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:832)
	at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:759)
	at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140)
	at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:82)
	at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
	at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
	at org.hibernate.jdbc.BorrowedConnectionProxy.invoke(BorrowedConnectionProxy.java:50)
	at $Proxy59.getTransactionIsolation(Unknown Source)
	at org.springframework.jdbc.datasource.DataSourceUtils.prepareConnectionForTransaction(DataSourceUtils.java:173)
	at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:464)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:377)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:263)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
	at $Proxy37.deleteLogDataBeforeDate(Unknown Source)
	...
	at java.lang.Thread.run(Thread.java:595)

 

根据上面的log信息和C3P0的源代码最后发现导致上述问题的原因是c3p0.unreturnedConnectionTimeout=180这个配置。这个配置规定了一个连接需要释放到连接池中的时间限制,而不管它是否正在被使用。此处就是因为连接使用超过了3分钟,被强制关闭释放导致的。所以删除这个配置即可解决上述问题。

 

而根据C3P0官方文档的建议,当你不清楚操作会持续多久时,就不需要配置这个选项的,原文如下:

Seconds. If set, if an application checks out but then fails to check-in [i.e. close()] a Connection within the specified period of time, the pool will unceremoniously destroy() the Connection. This permits applications with occasional Connection leaks to survive, rather than eventually exhausting the Connection pool. And that's a shame. Zero means no timeout, applications are expected to close() their own Connections. Obviously, if a non-zero value is set, it should be to a value longer than any Connection should reasonably be checked-out. Otherwise, the pool will occasionally kill Connections in active use, which is bad. This is basically a bad idea, but it's a commonly requested feature. Fix your $%!@% applications so they don't leak Connections! Use this temporarily in combination with debugUnreturnedConnectionStackTraces to figure out where Connections are being checked-out that don't make it back into the pool!

详细参见 unreturnedConnectionTimeout

分享到:
评论

相关推荐

    C3P0连接池配置.doc

    C3P0连接池的配置涉及到多个方面,用于优化数据库连接的创建、管理和维护。 1. **acquireIncrement**:当连接池中的连接耗尽时,C3P0会一次性尝试获取的连接数。默认值为3,这意味着当需要更多连接时,C3P0会每次...

    C3p0连接池问题

    这篇博客文章可能详细讨论了C3p0在实际应用中遇到的问题及解决方案。 C3p0连接池的工作原理主要包括以下几个关键点: 1. 连接初始化:C3p0在启动时会根据配置参数创建一定数量的初始连接。 2. 连接池管理:当应用...

    C3P0连接池jar包.rar

    5. **异常处理**:当数据库连接出现问题时,C3P0能够自动恢复,避免因为单个连接问题导致整个应用的瘫痪。 6. **连接池的监控**:C3P0提供了MBean(Managed Beans)接口,可以通过JMX(Java Management Extensions...

    C3P0连接池jar包

    6. **异常处理**:C3P0具有完善的异常处理机制,当数据库连接出现问题时,可以及时反馈错误信息,并尝试恢复连接。 7. **JNDI集成**:C3P0可以被注册到JNDI服务中,使得应用可以通过JNDI查找来获取数据源,方便了...

    C3P0详细配置C3P0详细配置.docC3P0详细配置.docC3P0详细配置.doc

    4. `autoCommitOnClose`:当关闭连接时,C3P0是否自动将所有未提交的事务回滚。默认值为false,表示不自动回滚。 5. `automaticTestTable`:C3P0用于测试连接是否有效的测试表。如果指定了此属性,将忽略`...

    C3P0连接池参数配置.doc

    在 C3P0 配置中,有多个关键参数用于定制连接池的行为。以下是对这些参数的详细解释: 1. `acquireIncrement`:当连接池中的连接耗尽时,C3P0 会一次尝试获取的连接数。默认值是 3。增加这个值可以更快地扩大连接池...

    C3P0的jar包

    3. **自动重连策略**:当数据库服务器重启或网络中断导致连接断开时,C3P0可以通过其内置的自动重连机制尝试重新建立连接,这在一定程度上提高了系统的健壮性。 4. **配置灵活性**:C3P0允许开发者通过配置文件或...

    C3P0连接池jar包(完整版).zip

    2. **连接自动测试**:在连接分配给应用程序前,C3P0会进行有效性检查,确保分配的连接是可用的,防止因数据库连接异常导致的程序错误。 3. **并发控制**:C3P0提供了线程安全的连接管理机制,支持多线程环境下的...

    C3P0连接池jar包.zip

    在给定的"**C3P0连接池jar包.zip**"中包含的"c3p0-0.9.5.2.jar"是C3P0的一个版本,用于解决特定的问题,例如"DEBUG -- CLOSE BY CLIENT STACK TRACE"。 这个错误信息"DEBUG -- CLOSE BY CLIENT STACK TRACE"通常...

    c3p0jar包和源码以及参数配置

    6. 异常处理:C3P0提供了完善的异常处理机制,当数据库连接出现问题时,可以及时通知应用程序,避免因连接问题导致的程序错误。 源码部分可以帮助开发者了解C3P0内部的工作流程,比如如何实现连接的创建、分配、...

    c3p0及其源码

    3. **连接测试**:在将连接分配给用户之前,C3P0可以执行预定义的SQL查询来验证连接的有效性,避免了因使用无效连接导致的错误。 4. **性能优化**:C3P0提供了多种配置选项,如最小/最大连接数、初始连接数、连接...

    Hibernate+c3p0连接池SQLServer 2000

    ### Hibernate + c3p0 连接池与 SQL Server 2000 的配置与问题解决 #### 一、背景介绍 在Java开发环境中,Hibernate作为一款流行的ORM框架,能够提供一套强大的对象-关系映射机制,使得开发者可以更加便捷地进行...

    c3p0连接池.zip

    - **连接测试**:C3P0提供了多种策略来验证连接的有效性,防止因数据库连接异常导致的问题。 - **自动关闭空闲连接**:可以通过配置参数设定连接的最大空闲时间,超时后自动关闭空闲连接,防止资源浪费。 - **...

    c3p0-0.9.5.5.src.zip

    1. **连接管理**:C3P0能够自动检测并回收无效的连接,防止因长时间未使用的连接导致的资源浪费。 2. **自动扩展**:当连接池中的连接被耗尽时,C3P0会自动创建新的连接,以应对高并发场景下的需求。 3. **多线程...

    用c3p0连接池连接数据库登录页面跳转不了

    在这个问题中,开发者遇到了"用c3p0连接池连接数据库登录页面跳转不了"的状况,这通常涉及到几个可能的原因,包括但不限于配置错误、资源管理问题或者代码逻辑问题。下面我们将详细探讨这些方面。 首先,我们需要...

    commons-dbutils-1.4(用于连接池)C3P0.rar

    2. **自动检测死锁**:C3P0可以检测并关闭长时间未使用的空闲连接,防止因数据库连接长时间未关闭导致的资源浪费。 3. **自动重试机制**:如果在获取连接时遇到异常,C3P0会自动重试,提高了应用的健壮性。 4. **...

    c3p0-0.9.1.2.src.zip

    3. **故障排查**:在生产环境中遇到数据库连接问题时,基于对c3p0源码的理解,可以更快定位问题,比如通过日志分析连接异常,找出导致问题的原因。 总的来说,c3p0-0.9.1.2.src.zip提供了一个深入学习数据库连接池...

    tomcat配置数据库断开频繁用c3p解决.zip

    针对以上问题,C3P0是一个流行的开源数据库连接池实现,它提供了许多高级功能和配置选项来优化数据库连接管理。以下是使用C3P0解决数据库断开频繁的一些关键步骤和配置项: 1. **引入C3P0依赖**:在项目中添加C3P0...

    [Database-support-package]-数据库需要用到的-c3p0/dbcp/dbUtils工具支持包

    使用c3p0可以有效地管理数据库连接,避免频繁创建和关闭连接导致的资源浪费。 2. DBCP(BasicDataSource):DBCP是Apache Commons的一个子项目,它基于Jakarta Pool实现了一个数据源。DBCP提供了一个基于Jakarta ...

Global site tag (gtag.js) - Google Analytics