首页 > 技术笔记 > Spring c3p0连接池无法释放,连接池一会就自动满了
2018
03-09

Spring c3p0连接池无法释放,连接池一会就自动满了

解决办法: 


将getSessionFactory().OpenSession()更改为getSessionFactory().getCurrentSession()。 

getSessionFactory().OpenSession() 这种方法从spring管理的sessionFactory中创建一个session,此session不是线程绑定的。当执行完一个实务的时候自动关闭session.这种方法不用手动管理实务,但是同一个线程多次的开启和关闭session,浪费系统资源和影响执行效率。而且通过这种方式打开的session不会自动关闭,现象时查询多次之后连接池满了,不会再继续查询了。

getSessionFactory().getCurrentSession()方法从spring管理的sessionFactory中创建一个绑定线程的session.spring会根据该线程的执行情况来自动判断是关闭session还是延迟关闭。这样做可以避免手动的管理实务,同时一个线程最多开启和关闭一次session又可以提高程序的性能。


还有一种原因可能是每次查询都会初始化连接数:<property name="initialPoolSize" value="3" />。导致查询多次就会造成too many connects错误。因此删除掉,应该在c3p0的文件配置里面配置。


通过更改session方法后,又出现这种错误:No Hibernate Session bound to thread 。 


解决办法: 
感觉是事务的问题,检查了下Spring配置,的确配置了事务,但是为什么会报这个错呢。查看事物注解,发现是因为@Transactional 注解未写在正确的地方,成功修改之后便好了。

还有可能的原因是没有在service没有在 spring管理而报的错。添加这句:<tx:annotation-driven transactionmanager="transactionManager"/>


本文》有 0 条评论

留下一个回复