java – MySql连接太多了
我讨厌提出一个在网络上被广泛询问的问题,但我似乎无法解决它.
我在一段时间后开始了一个项目,经过一个月的测试后,我遇到了“Too many connections”错误.我调查了它,并通过增加max_connections来“解决”它.然后这工作. 从那时起,越来越多的人开始使用它,它再次受到重创.当我是网站上唯一的用户时,我输入“show processlist”,它会出现大约50个仍然打开的连接(在命令中说“Sleep”).现在,我不知道为什么这些是开放的,但在我的代码中,我检查并检查每个连接,我关闭. 即. public int getSiteIdFromName(String name,String company)throws DataAccessException,java.sql.SQLException{ Connection conn = this.getSession().connection(); Statement smt = conn.createStatement(); ResultSet rs=null; String query="SELECT id FROM site WHERE name='"+name+"' and company_id='"+company+"'"; rs=smt.executeQuery(query); rs.next(); int id=rs.getInt("id"); rs.close(); smt.close(); conn.close(); return id; } 每次我在网站上做其他事情时,都会打开另一个连接,但不会关闭. 解决方法
使用您的方法,如果在调用conn.close()之前抛出任何异常,则永远不会关闭连接.您需要在try块中获取它(以及语句和结果集)并在finally块中将其关闭.无论是否抛出异常,都将始终执行finally中的任何代码.有了这个,您可以确保关闭昂贵的资源.
这是一个重写: public int getSiteIdFromName(String name,String company) throws DataAccessException,java.sql.SQLException { Connection conn = null; Statement smt = null; ResultSet rs = null; int id = 0; try { conn = this.getSession().connection(); smt = conn.createStatement(); String query = "SELECT id FROM site WHERE name='" + name + "' and company_id='" + company + "'"; rs = smt.executeQuery(query); rs.next(); id = rs.getInt("id"); } finally { if (rs != null) try { rs.close(); } catch (SQLException logOrIgnore) {} if (smt != null) try { smt.close(); } catch (SQLException logOrIgnore) {} if (conn != null) try { conn.close(); } catch (SQLException logOrIgnore) {} } return id; } 也就是说,此代码对SQL injection attacks敏感.使用PreparedStatement而不是Statement. 也可以看看: > Sun Exceptions tutorial: The Finally block (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |