`
TimerBin
  • 浏览: 355101 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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的连接池配置信息如下所示:

 

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">   
    <!-- 基本属性 url、user、password -->  
    <property name="url" value="${jdbc.url};autoReconnect=true" />  
    <property name="username" value="${jdbc.user}" />  
    <property name="password" value="${jdbc.password}" />  
    <!-- 配置初始化大小、最小、最大 -->  
    <property name="initialSize" value="1" />  
    <property name="minIdle" value="1" />   
    <property name="maxActive" value="20" />  
    <!-- 配置获取连接等待超时的时间 -->  
    <property name="maxWait" value="60000" />  
   
    <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->  
    <property name="timeBetweenEvictionRunsMillis" value="60000" />  
   
    <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->  
    <property name="minEvictableIdleTimeMillis" value="300000" />  
    
    <property name="validationQuery" value="SELECT 'x'" />  
	<!-- 申请连接的时候检测,如果空闲时间大于 timeBetweenEvictionRunsMillis, 执行validationQuery检测链接是否有效-->
    <property name="testWhileIdle" value="true" />  
	<!-- 申请连接的时候检测,执行validationQuery检测链接是否有效-->
    <property name="testOnBorrow" value="false" />  
	<!-- 返还连接的时候检测,执行validationQuery检测链接是否有效-->
    <property name="testOnReturn" value="false" />  
   
    <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->  
    <property name="poolPreparedStatements" value="true" />  
    <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />  
   
    <!-- 配置监控统计拦截的filters,去掉后监控界面sql无法统计 -->  
    <property name="filters" value="stat" />
    
    <!-- 打开removeAbandoned 开关,对于建立时间超过removeAbandonedTimeout的连接强制关闭-->  
    <property name="removeAbandoned" value="true" />
    <!-- 为removeAbandonedTimeoutMillis(默认300*1000)设置值,与 removeAbandoned 关联使用配置指定连接建立多长时间就需要被强制关闭,此时(1800*1000)-->  
    <property name="removeAbandonedTimeout" value="1800" />  
	
</bean>

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

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

.....
<!-- autoReconnect=true -->
<property name="url" value="${jdbc.url};autoReconnect=true" />  
.....
<!-- 打开removeAbandoned 开关,对于建立时间超过removeAbandonedTimeout的连接强制关闭-->  
	<property name="removeAbandoned" value="true" />
	<!-- 为removeAbandonedTimeoutMillis(默认300*1000)设置值,与 removeAbandoned 关联使用配置指定连接建立多长时间就需要被强制关闭,此时(1800*1000)-->  
    <property name="removeAbandonedTimeout" value="1800" />  
...

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

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

 

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

 

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

//定义事务
<bean id="dataSourceManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource"/>
</bean>


//引入事务  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 ,告别重启!

 

分享到:
评论

相关推荐

    java开发的课程设计图书管理系统源码.zip

    3、druid 数据库连接池配置 url=jdbc:mysql://localhost:3306/db_zbcbms?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 username=root password=123456 driver=...

    PHP-Druid:具有PECL扩展名PHP的Druid驱动程序

    PHP-德鲁伊 具有PECL扩展名PHP的Druid驱动程序安装使安装PHP-Druid $ /path/to/phpize$ ./configure --with-php-config=/path/to/php-config$ make && make installPECL安装PHP-Druid $ pecl install Druid设定档...

    DruidJDBCUtils.java

    InputStream is = DruidJDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"); prop.load(is); ds = DruidDataSourceFactory.createDataSource(prop); } catch (IOException e) { e....

    JDBC DruidDataSource dataSource = new DruidDataSource();

    JDBC DruidDataSource dataSource = new DruidDataSource();

    druid-1.1.10-API文档-中文版.zip

    赠送jar包:druid-1.1.10.jar; 赠送原API文档:druid-1.1.10-javadoc.jar; 赠送源代码:druid-1.1.10-sources.jar; 赠送Maven依赖信息文件:druid-1.1.10.pom; 包含翻译后的API文档:druid-1.1.10-javadoc-API...

    druid-1.1.10_采集_druid-1.1.10_Druid_

    Druid首先是一个数据库连接池。Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。内置了StatFilter功能,能采集非常完备的连接池执行信息,Druid连接...

    druid-1.1.16-API文档-中文版.zip

    赠送jar包:druid-1.1.16.jar; 赠送原API文档:druid-1.1.16-javadoc.jar; 赠送源代码:druid-1.1.16-sources.jar; 赠送Maven依赖信息文件:druid-1.1.16.pom; 包含翻译后的API文档:druid-1.1.16-javadoc-API...

    druid-1.0.29.jar

    druid

    druid-spring-boot-starter-1.2.8-API文档-中文版.zip

    赠送jar包:druid-spring-boot-starter-1.2.8.jar; 赠送原API文档:druid-spring-boot-starter-1.2.8-javadoc.jar; 赠送源代码:druid-spring-boot-starter-1.2.8-sources.jar; 赠送Maven依赖信息文件:druid-...

    druid-1.2.8-API文档-中英对照版.zip

    赠送jar包:druid-1.2.8.jar; 赠送原API文档:druid-1.2.8-javadoc.jar; 赠送源代码:druid-1.2.8-sources.jar; 赠送Maven依赖信息文件:druid-1.2.8.pom; 包含翻译后的API文档:druid-1.2.8-javadoc-API文档-...

    druid-1.0.19

    druid-1.0.19.jar Druid首先是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。 Druid已经在阿里巴巴...

    SpringMVC+Spring+Mybatis+Druid框架源码

    SpringMVC+Spring+Mybatis+Druid框架,通过Spring与Mybatis集成,开发一个简单用户增加的Web项目。用到了用的最广的阿里的Druid连接池

    druid-0.2.20

    druid-0.2.20.jar Druid首先是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。 Druid已经在阿里巴巴...

    druid下载 数据库连接池

    druid下载 数据库连接池 内置三个jar包和一个配置文件 druid.properties druid-1.0.9.jar druid-1.0.9-javadoc.jar druid-1.0.9-sources.jar

    Druid jar 阿里数据库

    包含了druid官方druid-1.0.4.jar druid-1.0.4-javadoc.jar druid-1.0.13-sources.jar Druid可以做什么? 1) 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,...

    druid-prometheus-exporter:用于收集 Apache Druid 指标并将其导出到 Prometheus 的服务

    此服务仅公开两个端点: /collect /metrics收集端点此端点是一个POST ,您可以在其中指示 Druid 将指标发送到。 端点将解析每个feed并更新相应的Prometheus指标。指标端点prometheus 客户端公开此端点上的所有指标...

    druid1.1.22.rar

    druid1.1.22

    druid配置文档+

    druidDataSource 配置文档

    druid-1.0.14-API文档-中文版.zip

    赠送jar包:druid-1.0.14.jar; 赠送原API文档:druid-1.0.14-javadoc.jar; 赠送源代码:druid-1.0.14-sources.jar; 包含翻译后的API文档:druid-1.0.14-javadoc-API文档-中文(简体)版.zip 对应Maven信息:...

    去除druid监控的阿里广告

    java集成阿里云的druid数据监控,但是下面有广告,如何去除druid监控的阿里广告,分享给大家

Global site tag (gtag.js) - Google Analytics