为什么80%的码农都做不了架构师?>>>   

最近工作发现,有个项目偶尔会报Couldn't rollback jdbc connection. No operations allowed after connection closed,项目技术选型如下:

  • 数据库mysql
  • 连接池druid
  • quartz

从异常来看,是jdbc连接关闭后,代码中依然拿出来使用了,从而报错。进一步了解到,mysql连接默认的最长维持时间是8小时,即建立连接后,如果8小时内客户端没关闭连接,mysql就会把连接关闭,如果客户端拿到了这个连接,就会报错了。这种情况一般会发生在连接池的情况下,因为在连接池中,为了提高资源利用率,连接使用完之后一般不会关闭,而是返回连接池中,等待下次使用。

网上提供的解决方法如下:

  1. 延长mysql的连接维持时间,需要修改mysql配置;
  2. 从连接池中获取连接时,校验连接的有效性。

以上两种方法一个是从服务端出发,一个是从客户端出来。由于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相关推荐

  1. Quartz Cluster出现异常Couldn‘t rollback jdbc connection. Communications link failure during rollback().

    记录使用Quartz Cluster出现异常已经解决方案 问题描述 ....省略部分错误 The last packet successfully received from the server w ...

  2. 使用线程池插入数据报Could not open JDBC Connection for transaction 异常

    前言 原因分析 解决方案 错误信息 前言 使用线程池插入数据报Could not open JDBC Connection for transaction 异常 Could not open JDBC ...

  3. flowable exception during resetting expired jobs: Could not open JDBC Connection for transaction

    项目中遇到的一个问题,记录一下:项目中引入flowable后,生产环境运行一段时间后,出现了奇怪的问题, [flowable-bpmn-reset-expired-jobs] org.flowable ...

  4. 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 ...

  5. Could not get JDBC Connection

    项目环境: JDK1.6+Tomcat7.078 部分报错信息: Caused by: org.springframework.jdbc.CannotGetJdbcConnectionExceptio ...

  6. 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 ...

  7. jdbc connection为什么放在webINF的lib里面

    jdbc connection为什么放在webINF的lib里面 转载于:https://www.cnblogs.com/xuedexin/p/5618040.html

  8. 记录一次Socket异常:java.net.SocketException: Connection reset

    先贴异常信息 java.net.SocketException: Connection resetat java.net.SocketInputStream.read(SocketInputStrea ...

  9. org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for

    错误样式: org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connecti ...

最新文章

  1. pytorch学习笔记(十二):详解 Module 类
  2. 插入始终是1_40分!1分钟4次!大JB太硬了!
  3. Data_Structure03-栈和队列
  4. nodejs mysql 模型_nodejs+mysql中怎样的model才是好的model?
  5. Excel批量转为Html,Html转换成Excel
  6. 基于TCP协议实现通信
  7. Centos6.5静态IP设置
  8. Java程序员需要了解的两种服务器设计模型
  9. Tensorflow 卷积神经网络 (二)
  10. 安装中文VS2008 SP1 和.NETFRAMEWORK 3.5SP1后智能提示是英文的解决办法
  11. c语言strTrimed函数用法介绍,TRIM函数
  12. 5G时代下的移动边缘计算(MEC)探索系列之四
  13. 如何自己开发一个Android APP(1)——环境配置
  14. 华硕win10键盘失灵_华硕键盘失灵一键修复的方法_win10华硕快捷键失灵的解决方法...
  15. “三次握手,四次挥手”你真的懂吗? 1
  16. globalThis is not defined 解决方案
  17. 计算机d盘可以格式化吗,d盘怎么格式化
  18. 腾讯云cos对象存储服务文件上传api就是一个大坑
  19. Android开发周报:Android Studio2.0发布、Activity动态创建
  20. Drf从入门到精通一(API接口、Postman、Restful规范、序列化、快速使用drf、CBV源码分析)

热门文章

  1. 浅谈Javascript中的void操作符
  2. 关于DateTime对象序列化为Json之后的若干问题
  3. PostgreSQL 模式删除背后的代码
  4. Linux下root无法运行Chrome浏览器的解决方法
  5. 版本管理 - Git 使用入门
  6. Intellij IDEA自动部署项目至远程FTP服务器
  7. 控制网页的Panel是否显示
  8. MySQL参数优化辅助工具_mysqltuner.pl
  9. 个人管理:简单,我微博中的一句话,总有你喜欢的
  10. KubeEdge向左,K3S向右