Druid connection holder is null autoReconnect=true

问题说明:

在开发spring整合druid链接池(1.0.2版本)的项目时,出现tomcat容器每天早上必须重启一次,否在链接池无法正常使用,其中错误日志如下所示:

 

### Cause: java.sql.SQLException: connection holder is null
; uncategorized SQLException for SQL []; SQL state [null]; error code [0]; connection holder is null; nested exception is java.sql.SQLException: connection holder is null
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:71)
........
Caused by: java.sql.SQLException: connection holder is null
	at com.alibaba.druid.pool.DruidPooledConnection.checkState(DruidPooledConnection.java:1083)
	at com.alibaba.druid.pool.DruidPooledConnection.getAutoCommit(DruidPooledConnection.java:698)
.....
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 44,982,301 milliseconds ago.  The last packet sent successfully to the server was 44,982,338 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

 

在网上找到一些的解决方式具体如下所示:

http://blog.csdn.net/ayanami001/article/details/48181243

http://blog.csdn.net/wo8553456/article/details/40396401

通过以上博客的说明等资料,我的druid的连接池配置信息如下所示:

 

   
      
      
      
      
      
      
       
      
      
      
   
      
      
   
      
      
    
      
	
      
	
      
	
      
   
      
      
      
   
      
    
    
      
    
      
      
	

 更多更完善配置解释可详见:http://blog.csdn.net/supingemail/article/details/50809982

在原有druid连接池配置上添加了一下配置:

.....

  
.....
  
	
	  
      
...

 通过配置后,发现依旧无法解决connection holder is null 错误信息,每天依旧需要重启解决。

于是通过断点调试,发现所有druid的配置均已生效,问题依旧未解决。

 

通过以上的尝试,猜测问题可能存在于代码中,并非时druid的配置导致的错误的产生,分析前后跟数据库链接池打交道的无非是事务,于是针对项目中的事务应用进行了排查,问题终于浮出水面:

 

由于该链接池使用的是如下方式定义的事务,在项目中手动配置事务使用,代码如下所示:

//定义事务

	



//引入事务  DataSourceTransactionManager 为 PlatformTransactionManager 子类
@Service
public class RedpackageStockManagerImpl {	
   @Autowired
    private PlatformTransactionManager dataSourceManager;
	...
}

 

上面代码单独出现无任何问题,问题就在于该项目中并非有只有一个数据库链接池,另一个数据库链接池也同样定义了一个 DataSourceTransactionManager事务管理器,而在使用@Autowired进行事务管理引入时是使用的根据类型进行引入,因此在通过事务使用dataSource链接池时,就会出现事务被错用现象,从而导致数据库链接池中的链接被非正常关闭,再下次再次使用时出现connection holder is null 错误,修改方法如下所示:

 

@Service
public class RedpackageStockManagerImpl {	
    @Resource(name = "dataSourceManager")
    private PlatformTransactionManager dataSourceManager;
	...
}

 

最后使用@Resource注解根据名称(dataSourceManager)依赖注入事务管理器,成功解决connection holder is null ,告别重启!

 

你可能感兴趣的:(Spring)