我不想提出一个网络上广泛提出的问题,但我似乎无法解决它。
我不久前开始了一个项目,经过一个月的测试后,我遇到了“连接太多”错误。我调查了它,并通过增加 max_connections 来“解决”它。这然后就起作用了。
从那时起,越来越多的人开始使用它,它再次受到关注。当我是该网站上的唯一用户时,我输入“show processlist”,它会显示大约 50 个仍处于打开状态的连接(在命令中显示“睡眠”)。现在,我不知道为什么这些是打开的,但在我的代码中我进行了三次检查,并且我打开的每个连接都会关闭。
ie.
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;
}
每次我在网站上执行其他操作时,都会打开而不是关闭另一批连接。
我的代码有问题吗?如果不是,可能是什么问题?
按照你的方法,如果抛出任何异常,连接将永远不会关闭before the conn.close()
叫做。您需要以以下方式获取它(以及语句和结果集)try
阻止并关闭它finally
堵塞。中的任何代码finally
will always无论是否抛出异常都会执行。有了这个你可以ensure昂贵的资源将被关闭。
这是一个重写:
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注入 http://en.wikipedia.org/wiki/SQL_injection attacks http://unixwiz.net/techtips/sql-injection.html. Use a PreparedStatement
代替Statement
.
See also:
- Sun 异常教程:Finally 块 http://java.sun.com/docs/books/tutorial/essential/exceptions/finally.html
- Sun JDBC 教程:简介 http://java.sun.com/docs/books/tutorial/jdbc/basics/index.html
- Sun JDBC 教程:如何使用PreparedStatement http://java.sun.com/docs/books/tutorial/jdbc/basics/prepared.html
- DAO 教程:如何正确使用基本 JDBC 代码 http://balusc.blogspot.com/2008/07/dao-tutorial-data-layer.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)