观传智播客李勇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 code
public 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() 抛出呢
求教咋处理