zoukankan      html  css  js  c++  java
  • 一次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

    採集的代码也加上事务






  • 相关阅读:
    企业级分布式应用服务EDAS_企业云计算解决方案-阿里云
    研发协同RDC,云上企业级一站式智能研发协同平台。
    信息系统项目管理师论文-论项目风险管理
    项目风险管理浅析|论文
    x
    项目管理师论文考试准备总结
    项目沟通管理电子书-免费在线阅读全文_代宏坤-超星读书
    管理沟通:领导者的必备软技能_图文_百度文库
    edp_百度百科
    xxx
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6915618.html
Copyright © 2011-2022 走看看