观传智播客李勇JDBC视频之《释放连接》所惑去年看他的视频时没觉得有什么问题,那时自己也不懂。今天忽然想起
观传智播客李勇JDBC视频之《释放连接》所惑
去年看他的视频时没觉得有什么问题,那时自己也不懂。
今天忽然想起这个问题,做了个小小的测试,结果发现他的方法好像有错误。
现来请教下大家。
Java code //释放链接 public static void free(ResultSet rs, Statement st, Connection conn) { try { if (rs != null) rs.close(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (st != null) st.close(); } catch (SQLException e) { e.printStackTrace(); } finally { if (conn != null) try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
这是他的源码。
http://longdechuanren.iteye.com/blog/632358
这个博客不是他本人的,但代码是根据他的视频整理的。
我先在mysql把最大连接数设为1.
然后把insert()方法执行3次,执行第三次的时候会报错(如果只执行2次,不报错),提示
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"
顺便问下,为什么不是执行第2次的时候报错?
Java codepublic void insert(String name, String passwd) { try { conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword); ps = conn .prepareStatement("insert into user(username,password) values(?,?)"); ps.setString(1, name); ps.setString(2, passwd); ps.executeUpdate(); } catch (Exception e) { System.out.println(e.toString()); } }
接着,我把他的free()方法插在第2次insert()方法后执行。我的设想是,已经关闭了连接,再执行第三次,就相当于开了新连接执行第一次,应该不会报错吧。可是执行结果依然报错,too many connections。
=================================
刚好前段时间有人在csdn问,java中交换两个数的方法是什么 api有吗?http://topic.csdn.net/u/20110307/21/ced90e4d-6d64-4709-b157-5be2d32ea0da.html
于是这时,我把他的 free(ResultSet rs, Statement st, Connection conn)的参数去掉,直接用free()。
运行,代码成功运行。
特别说明:如有兴趣,请自己测试下。
分2种情况:
把数据库操作的insert方法和主函数放一个类;再运行 free(有参数)和free();
把数据库操作的insert方法和主函数分开放在两个类;再运行free(有参)和free()。
==============================================
实验结果,李勇写错了。数据库关闭连接的方法里,不应该带参数。
即应该用free(),而不要用 free(ResultSet rs, Statement st, Connection conn)
如果我的实验有漏洞或根本就是我错了,或我和李勇都错,请狂喷并说明原因
[解决办法]因为你的mysql安装目录下的my.ini中设定的并发链接数太少
你循环链接数据库的时候
前面的还没关呢后面的就来了
所以是 "too many connections"
这是MySQL的问题
不是那个老师的问题
看程序,写得还挺规范吧。
[解决办法]try {
}catch(){
}不要整那么多
[解决办法]请问楼上7楼的
rs.close() 抛出呢
求教咋处理