当前位置: 代码迷 >> J2EE >> com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
  详细解决方案

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:

热度:513   发布时间:2016-04-22 01:57:19.0
观传智播客李勇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() 抛出呢
求教咋处理
  相关解决方案