之因此会出现这个异常,是由于Mysql在5之后针对超长时间DB链接作了一个处理,那就是若是一个DB链接在无任何操做状况下过了8个小时后,Mysql会自动把这个链接关闭。因此使用链接池的时候虽然链接对象还在可是连接数据库的时候会一直报这个异常。解决方法很简单在Mysql的官方网站上就能够找到。 有两个方法
###第一种是在DB链接字符串后面加一个参数。
这样的话,若是当前连接由于超时断掉了,那么驱动程序会自动从新链接数据库。java
jdbc:mysql://localhost:3306/makhtutat?autoReconnect=true
不过Mysql并不建议使用这个方法。由于第一个DB操做失败的后,第二DB成功前若是出现了从新链接的效果。mysql
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推荐的,须要程序员手动处理异常。程序员
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));} }