博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mysql异常:MySQLNonTransientConnectionException: No operations allowed after statement closed
阅读量:6005 次
发布时间:2019-06-20

本文共 2163 字,大约阅读时间需要 7 分钟。

Mysql异常:MySQLNonTransientConnectionException: No operations allowed after statement closed

  MySQLNonTransientConnectionException: No operations allowed after statement closed

    之所以会出现这个异常,是因为Mysql在5以后针对超长时间DB连接做了一个处理,那就是如果一个DB连接在无任何操作情况下过了8个小时后,Mysql会自动把这个连接关闭。所以使用连接池的时候虽然连接对象还在但是链接数据库的时候会一直报这个异常。解决方法很简单在Mysql的官方网站上就可以找到。

第一种是在DB连接字符串后面加一个参数。

这样的话,如果当前链接因为超时断掉了,那么驱动程序会自动重新连接数据库。

jdbc:mysql://localhost:3306/makhtutat?autoReconnect=true

 

不过Mysql并不建议使用这个方法。因为第一个DB操作失败的后,第二DB成功前如果出现了重新连接的效果。这个失败操作将不会处于一个事务以内,第二DB操作如果成功的话,这个事务将被提交。

conn.createStatement().execute(  "UPDATE checking_account SET balance = balance - 1000.00 WHERE customer='Smith'");conn.createStatement().execute(  "UPDATE savings_account SET balance = balance + 1000.00 WHERE customer='Smith'");conn.commit();

 

当然如果出现了重新连接,一些用户变量和临时表的信息也会丢失。

另一种方法是Mysql推荐的,需要程序员手动处理异常。

public void doBusinessOp() throws SQLException {    Connection conn = null;    Statement stmt = null;    ResultSet rs = null;    int retryCount = 5;    boolean transactionCompleted = false;    do {        try {            conn = getConnection(); // assume getting this from a                                    // javax.sql.DataSource, or the                                    // java.sql.DriverManager            conn.setAutoCommit(false);            retryCount = 0;            stmt = conn.createStatement();            String query = "SELECT foo FROM bar ORDER BY baz";            rs = stmt.executeQuery(query);            while (rs.next()) {            }            all.close()            transactionCompleted = true;        } catch (SQLException sqlEx) {            String sqlState = sqlEx.getSQLState();           // 这个08S01就是这个异常的sql状态。单独处理手动重新链接就可以了。            if ("08S01".equals(sqlState) || "40001".equals(sqlState))                 {                                    retryCount--;                             } else {                                     retryCount = 0;                                 }                 } finally {                             all close:                     }          } while (!transactionCompleted && (retryCount > 0));}}

 

 

 

来自:  http://blog.csdn.net/bedweather/article/details/6743951

 

你可能感兴趣的文章
Drupal第三方模块汇集(一)
查看>>
我的友情链接
查看>>
使用spring的自身的listener进行web的配置
查看>>
linux学习之“VI”与“VIM”
查看>>
linux下无线网卡驱动安装
查看>>
oracle recyclebin与flashback drop
查看>>
我的友情链接
查看>>
svmlight使用说明
查看>>
LVM
查看>>
学习之shell脚本
查看>>
Andorid Launcher程序代码分析
查看>>
Swing 和AWT之间的关系
查看>>
Mysql设置自增长主键的初始值
查看>>
Android计时器正确应用方式解析
查看>>
性能及监控
查看>>
linux系统CPU、内存、硬盘、网络、lnmp服务整体监控邮件报警
查看>>
我的友情链接
查看>>
个人总结问卷调查,头脑风暴,焦点小组的区别
查看>>
【转】不懂得使用工具的测试不是好测试
查看>>
JMeter基础之-使用技巧
查看>>