问题说明:
在开发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 ,告别重启!
相关推荐
spring.datasource.druid.stat-filter.enabled=true # 慢查询阈值,单位毫秒 spring.datasource.druid.slow-sql-millis=3000 # 日志打印 spring.datasource.druid.logging-enabled=true spring.datasource....
Druid是阿里巴巴开源的一个数据库连接池组件,全称为"Druid Data Source",它不仅是一个优秀的数据库连接池,还包含了监控统计、SQL解析、日志、拦截器等功能,为Java开发人员提供了强大的数据库连接管理和监控工具...
app.datasource.cbssxin.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 ``` 配置 Druid 管理后台 在 SpringBoot 项目中,需要配置 Druid 管理后台,以便于查看数据库连接池...
Tomcat 连接池和阿里 Druid 连接池的配置和比较 Tomcat 连接池是一种基于 Java 的数据库连接池实现,提供了高效、可靠的数据库连接管理。阿里 Druid 连接池是阿里巴巴开发的开源连接池,提供了高性能、可靠的数据库...
spring.datasource.druid.stat-view-servlet.enabled=true # 设置 Druid 登录账号和密码 spring.datasource.druid.stat-view-servlet.login-username=admin spring.datasource.druid.stat-view-servlet.login-...
spring.datasource.one.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 ``` 这里,我们配置了 Druid 的多个关键参数: - `initialSize` 和 `minIdle` 分别指定了连接池初始化时的...
spring.datasource.druid.connection-properties=config.decryptPublickey=公钥;druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 ``` 这里需要注意的是`spring.datasource.druid.password`需要替换为加密...
阿里Druid连接池是阿里巴巴开源的一款高性能的数据库连接池组件,它在Java应用程序中扮演着重要的角色,特别是在大型分布式系统中,对数据库连接的管理、监控和优化具有显著的效果。Druid提供了强大的监控和扩展功能...
Java通过Druid连接MySQL是一种常见的数据库操作方式,Druid是一个强大的数据库连接池组件,由阿里巴巴开源,它提供了优秀的性能、全面的监控以及强大的扩展性。在这个场景中,我们将探讨如何在Java环境中使用Druid来...
spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 spring.datasource.druid.min-idle=1 spring.datasource.druid.time-between-eviction-runs-millis=60000 ...
常见的JDBC连接池实现有Apache的DBCP、C3P0、HikariCP、Druid等。每个连接池都有自己的特性和优势,例如: 1. DBCP(BasicDataSource):Apache基础数据源,简单易用,但性能相比其他连接池稍弱。 2. C3P0:提供了...
spring.datasource.druid.test-on-borrow=true spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=mydb spring.datasource.username=myuser spring.datasource.password=mypassword ``` 这里的...
spring.datasource.druid.filter.stat=true ``` 这里,`initial-size`和`min-idle`定义了初始化时和最小连接数,`max-active`指定了最大连接数,`test-on-borrow`表示在获取连接时是否进行验证,`filter.stat`启用...
大数据Druid集群实时分析搭建 Druid是大数据实时分析平台,能够处理大量数据的实时查询和分析。以下是大数据Druid集群实时分析搭建的详细步骤和知识点: 环境准备 * 3台ECS服务器,each with 4 cores, 8G memory,...
在Java Web开发中,SSM(Spring、Spring MVC、MyBatis)框架组合是常见的选择,而Druid作为一款高效、强大的数据库连接池,被广泛应用于SSM项目中。本教程将详细介绍如何在SSM项目中配置并使用Druid连接池。 首先,...
4. **运行测试**:启动Spring Boot应用,调用`testConnection`方法,即可验证Druid数据源是否成功连接到PostgreSQL数据库。 在这个过程中,Druid会根据配置自动初始化并管理连接池,当应用程序需要连接时,可以从池...
Druid连接池是Java开发中广泛使用的数据库连接池组件,它由阿里巴巴公司开发并维护,旨在提供高效的、基于扩展的数据库连接管理。Druid的核心特性包括性能监控、SQL解析、安全过滤以及丰富的健康检查机制,使其在...
3、druid 数据库连接池配置 url=jdbc:mysql://localhost:3306/db_zbcbms?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 username=root password=123456 driver=...
Druid连接池是一款高效、功能强大且高度可扩展的数据库连接池组件,广泛应用于Java Web开发中,以提高数据库连接的管理效率和应用性能。Druid是阿里巴巴开源的一个项目,其设计目标是提供监控、扩展性以及全面的...