通过c3p0配置连接池的时候,在进行压力测试的时候,日志出现了这样一个错误:Data source rejected establishment of connection, message from server: “Too many connections”

数据库的连接过多。

然后查看mysql的最大连接数,为100。

c3p0连接redis mysql c3p0连接池强制释放连接_最大连接数


于是便更改最大连接池。

由于MySQL默认的最大连接数为100,MySQL允许的最大连接数16384。Windows下由于线程数限制MySQL最大连接数为2048。

于是更改为2000。但是数据库连接池最大只有这多,如果建立连接数过多,依旧会超载。

所以要从根本上解决,那么就要释放连接池。


解决办法:
将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配置,的确配置了事务,但是为什么会报这个错呢。于是便在网上找到方法,在dao层加上@Transactional ,于是问题就解决了。

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

如果你对生活感觉到了绝望,请不要气馁。因为这样只会让你更加绝望! 所谓的希望往往都是在绝望中萌发的,所以,请不要放弃希望!