mysql数据库报__No operations allowed after connection closed

本文探讨了MySQL5及以上版本对长时间未操作的连接自动关闭的问题,并提供了两种解决方案:通过url参数设置autoReconnect=true实现自动重连,以及在数据库连接配置中加入validation-query和time-between-eviction-runs-millis参数来定期验证和回收空闲连接。

部署后的项目,第二天发现其中的一个mysql连接数据源没有显示,打开日志后发现报错了(No operations allowed after connection closed) ,经过一番摆渡,发现是因为MySQL5及更新的版本会对超过8小时并且无任何操作的数据库连接进行关闭,但是你得数据库连接池并不知道此连接已失效,当你再次访问的时候,连接池就奉上此失效连接,so Exception.
关于解决此问题的方法,我做了以下两种尝试:

  1. url后加上autoReconnect=true
    这个方法我试用了,发现可以(看网上说官网不推荐这种解决方式,说是会出现 事务状态混淆),但我看官网上在5.1.45版本中专门对此问题做出了修复, 具体的大家可以测试测试
    在这里插入图片描述
  2. 数据库连接配置信息中加入
    validation-query:SELECT 1 (验证数据库连接的有效性)
    time-between-eviction-runs-millis:18800 (空闲连接回收的时间间隔)

注: 个人观点 仅供参考!!!

Kettle错 “no operations allowed after connection closed” 通常是因为尝试使用已经关闭的数据库连接进行操作。参考相关信息,可能的原因及解决办法如下: #### 数据库连接超时问题 MySQL 5.0 以后,若一个数据库连接在无操作情况下超过 8 小时(MySQL 服务器默认超时时间),会自动关闭该连接。而数据库连接池可能不知道连接已失效,仍将其提供给请求,引发此错误。 对于 Spring Boot 2.0 以上版本,mysql - connector - java 默认使用 8.0 以上版本。在 Kettle 中,可以通过调整数据库连接池的配置,避免使用失效连接。例如,设置连接池的最大空闲时间小于 MySQL 服务器的超时时间,确保在连接被 MySQL 关闭前,连接池先将其回收。 ```properties # 示例配置,设置最大空闲时间为 7 小时 spring.datasource.hikari.max-idle-time=25200000 ``` #### 代码中连接关闭问题 若代码里连接在静态代码块中创建,验证完后关闭连接,之后重复验证时,由于静态代码块只在启动时执行一次,后续连接无法再打开,从而错。在 Kettle 中,要保证每次使用数据库连接时,连接是有效的,避免提前关闭连接。例如,在需要使用连接的操作前后正确管理连接的打开和关闭: ```java Connection conn = null; try { // 获取连接 conn = DriverManager.getConnection(url, username, password); // 执行数据库操作 Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM your_table"); while (rs.next()) { // 处理结果集 } } catch (SQLException e) { e.printStackTrace(); } finally { // 确保连接在使用完后关闭 if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } ``` #### 关联注解配置问题 在使用注解 `@ManyToOne(fetch = FetchType.LAZY)` 等关联配置时,也可能引发连接关闭异常。在 Kettle 中,若涉及此类关联查询,需确保关联配置正确,避免在连接关闭后进行延迟加载操作。例如,合理设置关联查询的加载策略,避免不必要的延迟加载。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值