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语句的时候,需要将这些操作放在同一个事物里面,否则会出现死锁问题(多线程测试后的结果)。

或者使用注解式事物,应该就能避免以上出现的这些死锁问题。