一次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=(SERVICE_NAME=orcl)))
jdbc.user=appds
jdbc.password=appds
c3p0.acquireIncrement=5
c3p0.maxIdleTime=60
c3p0.maxPoolSize=80
c3p0.minPoolSize=10
c3p0.initialPoolSize=10
c3p0.maxStatements=0
c3p0.idleConnectionTestPeriod=60
c3p0.acquireRetryAttempts=30
c3p0.acquireRetryDelay=1000
c3p0.breakAfterAcquireFailure=false
c3p0.testConnectionOnCheckout=false

jdbcdata.driverClass=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbcdata.jdbcUrl=jdbc:sqlserver://10.12.18.241:1433;databaseName=data;
jdbcdata.user=cawasdatauser
jdbcdata.password=cawas606
c3p0ObsDataDB.maxPoolSize=30

发现了问题,我首先在c3p0上加上调试信息的配置:

c3p0.debugUnreturnedConnectionStackTraces=true

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

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

<property name="breakAfterAcquireFailure" value="${c3p0.breakAfterAcquireFailure}" />

<property name="testConnectionOnCheckout" value="${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

采集的代码也加上事务

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

时间: 2024-11-03 21:48:09

一次c3p0连接池连接异常错误的排查的相关文章

springboot---整合druid连接池---连接oracle数据库---整合mybatis---整合thymeleaf---日志配置

目录 在新建的springboot项目pom文件中新添druid连接池的依赖 在application.properties配置文件中添加配置 配置静态文件目录和模板文件目录 @(springboot---整合druid连接池---连接oracle数据库---整合mybatis---整合thymeleaf---日志配置) 在新建的springboot项目pom文件中新添druid连接池的依赖 <!-- druid数据库连接池 --> <dependency> <groupId

JNDI连接池连接Oracle数据库

今天做了一个评论的小功能,要求用JNDI连接池连接Oracle数据库,以前只是测试了是否连接的上,现在没想到一个JNDI连接池连接Oracle数据库,纠结了好久,原来都是Oracle数据库的问题,这是过失.下面介绍一下JNDI连接池连接Oracle数据库. JNDI介绍 什么是JNDI? JNDI(Java Naming and Directory Interface,Java命名和目录接口) 是一组在Java应用中访问命名和目录服务的API 通过名称将资源与服务进行关联 什么是连接池技术? 连

python通过连接池连接redis,操作redis队列

在每次使用redis都进行连接的话会拉低redis的效率,都知道redis是基于内存的数据库,效率贼高,所以每次进行连接比真正使用消耗的资源和时间还多.所以为了节省资源,减少多次连接损耗,连接池的作用相当于缓存了多个客户端与redis服务端的连接,当有新的客户端来进行连接时,此时,只需要去连接池获取一个连接即可,实际上连接池就是把一个连接共享给多个客户端,可以说是广播,要用的话就去接收. #-*-coding:utf-8-*- import redis # 连接池连接使用,节省了每次连接用的时间

关于c3p0连接池连接mysql数据库需要注意的几点

什么是数据库连接池: 用池来管理Connection,这可以重复使用Connection.有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象. 当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection"归还"给池.池就可以再利用这个Connection对象了. 导入DBUtils的工具包:commons-dbutils-1.6.jar commons-dbuti

spring c3p0数据库连接池连接配置

c3p0连接池配置 xml文件内容如下: C3P0拥有比DBCP更丰富的配置属性,通过这些属性,可以对数据源进行各种有效的控制: acquireIncrement:当连接池中的连接用完时,C3P0一次性创建新连接的数目: acquireRetryAttempts:定义在从数据库获取新连接失败后重复尝试获取的次数,默认为30: acquireRetryDelay:两次连接中间隔时间,单位毫秒,默认为1000: autoCommitOnClose:连接关闭时默认将所有未提交的操作回滚.默认为fals

使用druid连接池的超时回收机制排查连接泄露问题

在工程中使用了druid连接池,运行一段时间后系统出现异常: Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60009, active 50 at org.springfr

连接池 连接 数据源

数据源--getConnection()JNDI 获取数据源数据源在tomcat容器的conf文件夹 context.xml配置<Resource name="jdbc/news" author="Container" type="javax.sql.DataSource"maxActive="100"连接池的最大数据库连接数.设为0表示无限制.maxIdle="30"最大空闲数,数据库连接的最大空闲

记录关于使用ADO.NET 连接池连接Oracle时Session信息不更新的坑

最近的一个项目中,由于界面查询的数据量比较大,关联的表比较多,有些数据查出来需要临时保存起来供后面的查询使用,于是想到了用oracle的临时表来实现这个需求.大家都知道,oracle的临时表有两种:事务级别临时表和会话级别临时表,我这里使用的是会话级别的临时表.当时把功能时候后就以为万事大吉了,没想到就在这里买下了一个坑.  坑的浮现:之后在为系统加调试日志时偶然发现了临时表的数据没有像oracle临时表的定义那样“不同会话独享临时表,临时表的数据在会话结束后被自动清空”.首先看第一次查询的日志

Java创建连接池连接不同数据库

在一个应用里面,可能涉及到连接多个不同数据库进行操作,而每次连接写不同的实现会很麻烦.前面已经会了用JDBC连接数据库,那么利用反射和工厂模式,可以实现连接不同的数据库,这样处理起来将会很方便.同时建造数据库连接池,处理多个业务数据处理. 那么具体怎么实现呢,下面一起来看一下: 整体结构如下: 第一步,先处理连接不同数据库 1.首先,将数据库配置信息创建一个公用类:JdbcUrl.java 主数据库可以用默认的构造方法,如果是连接其他库,则通过传递参数的方式来处理. 数据库参数有如下几个: 1