c3p0连接池不能够自由消除方案

现身这些标题首先个想法就是连接池的参数设置难题,把最菲尼克斯接数量设置大片段就行了,可是自身就1个客服端访问服务器,连接池连接数量不恐怕会不够用.小编的档次架构是spring
mvc+hibernate,用spring管总管物.分析之后自然是dao层获取的session没有close掉.

由此c3p0配置连接池的时候,在拓展压力测试的时候,日志出现了这么三个谬误:Data
source rejected establishment of connection, message from server: “Too
many connections”
数据库的总是过多。
然后查看mysql的最亚松森接数,为100。
图片 1
于是便更改最洛桑接池。
是因为MySQL默许的最安卡拉接数为100,MySQL允许的最奥斯汀接数16384。Windows下是因为线程数限制MySQL最第Billy斯接数为2048。
于是更改为三千。可是数据库连接池最大唯有那多,即便创设连接数过多,依旧会超载。
于是要从根本上化解,那么就要自由连接池。
参照博客:http://blog.csdn.net/yonglelaoren/article/details/28886593

说到底消除办法:把sessionFactory.openSession()改成sessionFactory.getCurrentSession() 

化解办法:
将getSessionFactory().OpenSession()更改为getSessionFactory().getCurrentSession()。
getSessionFactory().OpenSession()
那种办法从spring管理的sessionFactory中创制二个session,此session不是线程绑定的。当执行完1个实务的时候自动关闭session.那种格局毫无手动管理实际事务,不过同一个线程多次的打开和倒闭session,浪费系统财富和熏陶执行效能。而且经过那种措施打开的session不会活动关闭,现象时查询多次自此连接池满了,不会再持续查询了。

自作者参考的博客地址,能够精通下那五个章程的意思:http://www.cnblogs.com/mu-mu/archive/2012/01/18/2325141.html

getSessionFactory().getCurrentSession()方法从spring管理的sessionFactory中开创1个绑定线程的session.spring会基于该线程的施市场价格况来自动判断是倒闭session依然延迟关闭。那样做能够幸免手动的军事管制实务,同时三个线程最多打开和倒闭3回session又有什么不可增进度序的性能。

还有一种原因大概是历次查询都会开头化连接数:<property name="initialPoolSize" value="3" />。导致查询多次就会造成too
many connects错误。由此删除掉,应该在c3p0的文件配置内部配备。

透过改动session方法后,又出新那种错误:No Hibernate Session bound to
thread 。
消除办法:
感觉到是事情的难题,检查了下Spring配置,的确配置了业务,然则为何会报这几个错呢。于是便在网上找到办法,在dao层加上@Transactional
,于是难题就化解了。
参考:http://www.cnblogs.com/hanxirensheng/archive/2012/03/28/2422433.html

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