mysqs数据库,连接池为dbcp、druid,出现问题:
1、The last packet successfully received from the server was 915,358 millisecon····
2、holder is null····
解决方法: 1、tomcat配置文件server.xml中,对外开放的端口配置中(<Connector ... />)加上minSpareThreads=“0”;表示Tomcat初始化时创建的线程数,因为我们从连接池中获取到的连接为失效的连接,mysql默认保持连接的有效时间为8小时,当从数据库中获取到连接,且超过8小时未使用时,就会报上面的错误。所以可以让tomcat启动时创建的初始线程数为0,避免线程等待,导致数据库连接等待时间超过8小时后出现上面的错误。(该方法降低了tomcat使用性能,好像也不能完全解决问题)。
2、有的时候,即使配置了以下内容,还是会出现holder is null问题(druid):
<!-- 配置间隔10分钟才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="600000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<property name="validationQuery" value="SELECT 'x'" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="true" />
<property name="testOnReturn" value="true" />
此时,根据druid的sql监控日志可以发现,逻辑连接打开次数和逻辑连接关闭次数不想到,关闭次数小于打开次数,说明有的连接没有关闭,我们的连接都是交给spring来管理的,不好发现是哪儿没有关闭或者归还连接,所以用以下配置,来强制关闭连接:
<!-- 关闭长时间不使用的连接,防止连接池泄漏 -->
<property name="removeAbandoned" value="true" />
<!-- 打开removeAbandoned功能 -->
<property name="removeAbandonedTimeout" value="1800" /> <!-- 1800秒,也就是30分钟 -->
以上都配置了,该问题应该能解决。
相关问题:
使用编程式事物的时候,也有可能由于数据库连接丢失,导致出现了死锁问题,可以在catch语句块的后面,加上finally,在finally里面判断是否的状态是否已经提交或者回滚,假如没有,则在finally里将事物回滚,并打印或记录日志。
finally {
if (!status.isCompleted())
transactionManager.rollback(status);
}
finally语句很有必要。
编程式事物还需要注意一点:对同一个表有多次DML语句的时候,需要将这些操作放在同一个事物里面,否则会出现死锁问题(多线程测试后的结果)。
或者使用注解式事物,应该就能避免以上出现的这些死锁问题。