quartz和数据库断连接的解决办法

本文介绍了一个关于Quartz调度器在与MySQL数据库交互过程中遇到的连接超时异常,并提供了一种通过配置自动重连及验证连接有效性的方式来避免此问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 109,769,894 milliseconds ago.  The last packet sent successfully to the server was 109,769,894 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) ~[na:1.7.0_67]
         at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) ~[na:1.7.0_67]
         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.7.0_67]
         at java.lang.reflect.Constructor.newInstance(Constructor.java:526) ~[na:1.7.0_67]
         at com.mysql.jdbc.Util.handleNewInstance(Util.java:389) ~[mysql-connector-java-5.1.35-bin.jar:5.1.35]
         at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1038) ~[mysql-connector-java-5.1.35-bin.jar:5.1.35]
         at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3609) ~[mysql-connector-java-5.1.35-bin.jar:5.1.35]
         at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2417) ~[mysql-connector-java-5.1.35-bin.jar:5.1.35]
         at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582) ~[mysql-connector-java-5.1.35-bin.jar:5.1.35]
         at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2531) ~[mysql-connector-java-5.1.35-bin.jar:5.1.35]
         at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:4852) ~[mysql-connector-java-5.1.35-bin.jar:5.1.35]
         at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:881) ~[c3p0-0.9.1.1.jar:0.9.1.1]
         at org.quartz.impl.jdbcjobstore.AttributeRestoringConnectionInvocationHandler.restoreOriginalAtributes(AttributeRestoringConnectionInvocationHandler.java:141) ~[quartz-2.2.1.jar:na]
         at org.quartz.impl.jdbcjobstore.JobStoreSupport.cleanupConnection(JobStoreSupport.java:3600) [quartz-2.2.1.jar:na]
         at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3819) [quartz-2.2.1.jar:na]
         at org.quartz.impl.jdbcjobstore.JobStoreSupport.acquireNextTriggers(JobStoreSupport.java:2756) [quartz-2.2.1.jar:na]
         at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:272) [quartz-2.2.1.jar:na]
Caused by: java.net.SocketException: Broken pipe
         at java.net.SocketOutputStream.socketWrite0(Native Method) ~[na:1.7.0_67]
         at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113) ~[na:1.7.0_67]
         at java.net.SocketOutputStream.write(SocketOutputStream.java:159) ~[na:1.7.0_67]
         at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) ~[na:1.7.0_67]
         at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) ~[na:1.7.0_67]
         at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3591) ~[mysql-connector-java-5.1.35-bin.jar:5.1.35]


quartz将配置保存在数据库时,如果数据库和quartz断连接,那么quartz读取数据库时会发生异常。

做如下配置:

org.quartz.dataSource.myDS.driver = org.mariadb.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/dxtdatabase?useUnicode=true&characterEnco
ding=UTF-8&autoReconnect=true&autoReconnectForPools=true
org.quartz.dataSource.myDS.user = root
org.quartz.dataSource.myDS.password = 123456
org.quartz.dataSource.myDS.maxConnections = 30
org.quartz.dataSource.myDS.validateOnCheckout = true
org.quartz.dataSource.myDS.validationQuery = select 1


org.quartz.dataSource.myDS.validateOnCheckout = true
org.quartz.dataSource.myDS.validationQuery = select 1
这两个配置的意思是使用连接时先判断是否有效。


&autoReconnect=true&autoReconnectForPools=true

这个配置没有效果,是开始尝试的第一个方案,没有坏的影响就没删。



### 配置 Quartz 连接MySQL 数据库 为了使 Spring Boot 应用程序中的 Quartz 调度器能够连接并操作 MySQL 数据库,需要完成几个关键配置。 #### 1. 添加 Maven 或 Gradle 依赖项 确保项目的 `pom.xml` 文件中包含了必要的依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> <!-- 如果使用的是 MySQL --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> ``` 对于 Gradle 用户,则应在 `build.gradle` 中添加相应的依赖声明[^1]。 #### 2. 创建数据库表结构 Quartz 使用一组预定义的 SQL 表来保存作业及其触发条件的信息。官方文档提供了针对不同 RDBMS 的建表语句脚本,在应用启动前需执行这些 DDL 命令创建所需的表格[^2]。 #### 3. 修改 application.properties 或者 application.yml 文件 设置 JDBC URL、用户名密码等参数以便于 Quartz 可以访问指定的数据源。以下是 YAML 格式的示例配置: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/quartz_db?useSSL=false&serverTimezone=UTC username: root password: your_password_here quartz: job-store-type: jdbc wait-for-jobs-to-complete-on-shutdown: true overwrite-existing-jobs: false properties: org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.threadPool.threadCount: 5 org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.tablePrefix: QRTZ_ org.quartz.jobStore.isClustered: true org.quartz.jobStore.clusterCheckinInterval: 20000 ``` 上述配置指定了 Quartz 将采用 JDBC 存储机制,并启用了集群支持功能;同时设置了线程池大小其他一些重要的属性值[^3]。 #### 4. 处理可能遇到的问题 当应用程序尝试与数据库建立连接时可能会抛出诸如 "Couldn't rollback JDBC Connection" 类型的错误消息。这通常是因为网络中或其他原因导致无法正常关闭资源所引起的。为了避免此类问题的发生,建议定期监控数据库连接状态以及合理设置超时时间等措施来增强系统的健壮性[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值