项目用ssh整合的,连接池一直有问题,最开始用的dbcp连接池,数据库连接几天就把数据库的连接都给占光了,后面换了c3p0,结果还是不行
[code="java"]An SQLException was provoked by the following failure: com.mchange.v2.resourcepool.ResourcePoolException: Attempted to use a closed or broken resource pool[/code]
先谢谢题主私信我。
这个问题我以前遇到过:其实准确的说不是连接池的问题。
先说下我的经验(用教训可能更合适),不一定适合题主,供参考。
集成SSH的项目中,会在dao层用到[b]getSession()[/b]方法来操作数据库记录,还有个方法[b]getHibernateTemplate()[/b],这两个方法其实是有区别的:
1、使用getSession()方法你只要继承sessionFactory就行,使用getHibernateTemplate()方法必须继承 HibernateDaoSupport,这点区别都不是特别重要的;
2、getSession()方法是没有经过spring包装的,spring会把最原始的session给你,在[b]使用完之后必须自己调用相应的close方法[/b],而且也不会对声明式事务进行相应的管理,一旦没有及时关闭连接,就会导致数据库连接池的连接数溢出;getHibernateTemplate()方法是经过spring封装的,例如添加相应的声明式事务管理,由spring管理相应的连接
我当时自己检查了dao层的代码,发现确实有很多使用session方式的DAO在最后没有关闭。
后来通过基类将获取session的方式统一了一下,问题就解决了。我觉得这才是根本的问题。
总结一下:
1、使用session实现DAO,必须要在最后关闭session,不然会导致连接池链接溢出
2、希望题主也自己看看代码,看是否存在同样的问题。
你数据库连接池配置了多少连接数啊?
首先你要确认是你的数据连接被占光了,如果确认是的话,那就说明有很多连接没有被释放,如果你是使用Hibernate之类的ORM框架以及用spring管理的话,是不会出现这种情况的,你得排查一下你的代码里面有没有自己获取Connection,然后没有close的。
你贴的异常,不像是数据库连接满了,倒像是数据库连接池满了,你把C3P0的连接数改大一些试试。
http://www.ablanxue.com/prone_11092_1.html
此文中配置文件中参数的作用是,当连接中断,连接池要能将中断的连接清除,并且生成新的连接供使用。这是连接池的维护问题
[code="java"]
30
100
false
[/code]
给连接池添加如上配置试一下看看。
你按这样修改试试
你可以到tomcat中conf下server.xml 中添加 其他的对应修改下 其中 1234 是对应的
cookies="true" reloadable="true" crossContext="true" >
(0)name="jdbc/OracleDB"
(1) auth="Container"
(2)type="javax.sql.DataSource"
password="basedba123"
driverClassName="oracle.jdbc.driver.OracleDriver"
maxIdle="10"
maxWait="20000"
username="basedba"
url="jdbc:oracle:thin:@127.0.0.1:1521:ORCL"
maxActive="100"/>
还需要在你的项目web中添加
(0) jdbc/OracleDB
(2) javax.sql.DataSource
(1) Container
(4)是项目名
[code="java"]
设置下initialPoolSize的值大小要在minPoolSize与maxPoolSize值大小之间
jdbc.datasource=com.mchange.v2.c3p0.ComboPooledDataSource
jdbc.show_sql=true
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/test
jdbc.user=root
jdbc.password=123456
jdbc.maxPoolSize=100
jdbc.minPoolSize=2
jdbc.initialPoolSize=2
jdbc.acquireIncrement=2
jdbc.maxStatements=1000
jdbc.maxIdleTime=300
jdbc.checkoutTimeout=5000
[/code]
我比较赞成的看法是你代码有问题,是不是你代码里有自己手动连接数据库的,而没有关闭,造成这部分连接不在spring的管理中