首页 > 代码库 > 一次c3p0连接池连接异常错误的排查

一次c3p0连接池连接异常错误的排查

最近写了一个数据库采集程序,大概过程是将SQLSERVER数据库的数据定时采集到Oracle数据库。1小时出一次数据,每次数据量在2W左右。环境采用Sping3+hibernate4,数据库连接池采用C3p0

奇怪的时候每隔一段时间都会报:“c3p0 connection is already closed” 

我开始的数据库连接池配置如下:oracle数据库开启事务,而采集的sqlserver数据库没有开启事务

jdbc.driverClass=oracle.jdbc.OracleDriver
jdbc.jdbcUrl=jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)(ADDRESS=(PROTOCOL=TCP)(HOST=10.12.18.240)(PORT=1521))(CONNECT_DATA=http://www.mamicode.com/(SERVICE_NAME=orcl)))>发现了问题,我首先在c3p0上加上调试信息的配置

c3p0.debugUnreturnedConnectionStackTraces=true
c3p0.unreturnedConnectionTimeout=90 (我的连接超时时间是60s,所以这设置了90s)

applicationContext数据源配置增加响应配置

<property name="breakAfterAcquireFailure" value=http://www.mamicode.com/"${c3p0.breakAfterAcquireFailure}" />
<property name="testConnectionOnCheckout" value=http://www.mamicode.com/"${c3p0.testConnectionOnCheckout}" />

果然发现很多未回收的连接,正常情况下超时未回收的连接会有一些,但是不会这么多啊。

经查资料在hibernate sessionFacory中增加配置(http://hi.baidu.com/austincao/item/fc9907da3d854e44fa576861)

Spring3.1去掉了HibernateDaoSupport类。hibernate4需要通过getCurrentSession()获取session。并且设置
<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>

在Spring @Transactional声明式事务管理,”currentSession”的定义为: 当前被 Spring事务管理器 管理的Session,此时应配置:
hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext。

另外在hibernate中使用sessionFactory.getCurrentSession()获取session时,需要为方法声明事务,为此将sqlserver

采集的代码也加上事务