日期:2014-05-20  浏览次数:20810 次

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