quartz异常:Couldn't rollback jdbc connection
为什么80%的码农都做不了架构师?>>>
最近工作发现,有个项目偶尔会报Couldn't rollback jdbc connection. No operations allowed after connection closed
,项目技术选型如下:
- 数据库mysql
- 连接池druid
- quartz
从异常来看,是jdbc连接关闭后,代码中依然拿出来使用了,从而报错。进一步了解到,mysql连接默认的最长维持时间是8小时,即建立连接后,如果8小时内客户端没关闭连接,mysql就会把连接关闭,如果客户端拿到了这个连接,就会报错了。这种情况一般会发生在连接池的情况下,因为在连接池中,为了提高资源利用率,连接使用完之后一般不会关闭,而是返回连接池中,等待下次使用。
网上提供的解决方法如下:
- 延长mysql的连接维持时间,需要修改mysql配置;
- 从连接池中获取连接时,校验连接的有效性。
以上两种方法一个是从服务端出发,一个是从客户端出来。由于mysql权限问题,无法直接修改mysql的配置,因此只能从客户端入手了。
项目中使用的连接池是druid,理所当然是druid的问题,baidu了下一圈下来,druid相关的设置如下:
<!-- 获取连接时检查连接是否可用,官方说会影响性能,不建议开启-->
<property name="testOnBorrow" value="false" />
<!-- 归还连接时检查连接是否可用,官方说会影响性能,不建议开启-->
<property name="testOnReturn" value="false" />
<!-- 空闲时检查,再配合多久检查一次,官方建议使用的方式 -->
<property name="testWhileIdle" value="true" />
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 检查语句 -->
<property name="validationQuery" value="SELECT 'x'" />
对照项目中的配置发现,两者基本一致。看来问题并不在druid。
再分析异常信息,发现报错都是在quartz相关的类中,因此将焦点转向了quartz。
在quartz中,发现有一段配置是这样的:
<bean id="schedulerFactoryBean"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false"><property name="quartzProperties"><props><prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop><prop key="org.quartz.threadPool.threadCount">50</prop><prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop><prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop><prop key="org.quartz.jobStore.dataSource">member</prop><prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop><!-- quartz数据库配置 --><prop key="org.quartz.dataSource.member.driver">com.mysql.jdbc.Driver</prop><prop key="org.quartz.dataSource.member.URL">${member.jdbc.url}</prop><prop key="org.quartz.dataSource.member.user">${member.jdbc.username}</prop><prop key="org.quartz.dataSource.member.password">${member.jdbc.password}</prop><prop key="org.quartz.dataSource.member.maxConnections">10</prop></props></property>
</bean>
这里可以发现,quartz并没有使用druid连接池,而是重新开启数据库连接。在quartz 2.2.1 jdbc 连接池参数配置中,知道了quartz默认的连接是c3p0,并且了解了相关配置项。继续搜索,发现有人也踩过这个坑:quartz和数据库断连接的解决办法,结合这两篇文章,我给出的解决方案如下:
<bean id="schedulerFactoryBean"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false"><property name="quartzProperties"><props><prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop><prop key="org.quartz.threadPool.threadCount">50</prop><prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop><prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop><prop key="org.quartz.jobStore.dataSource">member</prop><prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop><prop key="org.quartz.dataSource.member.driver">com.mysql.jdbc.Driver</prop><prop key="org.quartz.dataSource.member.URL">${member.jdbc.url}</prop><prop key="org.quartz.dataSource.member.user">${member.jdbc.username}</prop><prop key="org.quartz.dataSource.member.password">${member.jdbc.password}</prop><prop key="org.quartz.dataSource.member.maxConnections">10</prop><!-- 添加的配置 --><prop key="org.quartz.dataSource.member.validateOnCheckout">true</prop><prop key="org.quartz.dataSource.member.validationQuery">SELECT 'x'</prop></props></property>
</bean>
只是在quartz配置文件中添加了两行:
<!-- 从连接池中获取连接时,验证连接是否有效 -->
<prop key="org.quartz.dataSource.member.validateOnCheckout">true</prop>
<!-- 验证语句 -->
<prop key="org.quartz.dataSource.member.validationQuery">SELECT 'x'</prop>
转载于:https://my.oschina.net/funcy/blog/2045908
quartz异常:Couldn't rollback jdbc connection相关推荐
- Quartz Cluster出现异常Couldn‘t rollback jdbc connection. Communications link failure during rollback().
记录使用Quartz Cluster出现异常已经解决方案 问题描述 ....省略部分错误 The last packet successfully received from the server w ...
- 使用线程池插入数据报Could not open JDBC Connection for transaction 异常
前言 原因分析 解决方案 错误信息 前言 使用线程池插入数据报Could not open JDBC Connection for transaction 异常 Could not open JDBC ...
- flowable exception during resetting expired jobs: Could not open JDBC Connection for transaction
项目中遇到的一个问题,记录一下:项目中引入flowable后,生产环境运行一段时间后,出现了奇怪的问题, [flowable-bpmn-reset-expired-jobs] org.flowable ...
- JMeter直连数据库报错Uncaught Exception java.lang.AbstractMethodError: com.mysql.jdbc.Connection.isValid(I)Z
报错:Uncaught Exception java.lang.AbstractMethodError: com.mysql.jdbc.Connection.isValid(I)Z in thread ...
- Could not get JDBC Connection
项目环境: JDK1.6+Tomcat7.078 部分报错信息: Caused by: org.springframework.jdbc.CannotGetJdbcConnectionExceptio ...
- JSP Tomcat8.0运行连接池时发生异常【AbstractMethodError oracle.jdbc.driver.T4CConnection.isValid(I)Z】...
原创 2015年12月28日 11:38:01 2004 一.Tomcat8.0运行连接池时发生异常: AbstractMethodError oracle.jdbc.driver.T4CConnec ...
- jdbc connection为什么放在webINF的lib里面
jdbc connection为什么放在webINF的lib里面 转载于:https://www.cnblogs.com/xuedexin/p/5618040.html
- 记录一次Socket异常:java.net.SocketException: Connection reset
先贴异常信息 java.net.SocketException: Connection resetat java.net.SocketInputStream.read(SocketInputStrea ...
- org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for
错误样式: org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connecti ...
最新文章
- pytorch学习笔记(十二):详解 Module 类
- 插入始终是1_40分!1分钟4次!大JB太硬了!
- Data_Structure03-栈和队列
- nodejs mysql 模型_nodejs+mysql中怎样的model才是好的model?
- Excel批量转为Html,Html转换成Excel
- 基于TCP协议实现通信
- Centos6.5静态IP设置
- Java程序员需要了解的两种服务器设计模型
- Tensorflow 卷积神经网络 (二)
- 安装中文VS2008 SP1 和.NETFRAMEWORK 3.5SP1后智能提示是英文的解决办法
- c语言strTrimed函数用法介绍,TRIM函数
- 5G时代下的移动边缘计算(MEC)探索系列之四
- 如何自己开发一个Android APP(1)——环境配置
- 华硕win10键盘失灵_华硕键盘失灵一键修复的方法_win10华硕快捷键失灵的解决方法...
- “三次握手,四次挥手”你真的懂吗? 1
- globalThis is not defined 解决方案
- 计算机d盘可以格式化吗,d盘怎么格式化
- 腾讯云cos对象存储服务文件上传api就是一个大坑
- Android开发周报:Android Studio2.0发布、Activity动态创建
- Drf从入门到精通一(API接口、Postman、Restful规范、序列化、快速使用drf、CBV源码分析)