Mic*_*abe 3 java mysql tomcat jdbc
我讨厌提出一个在网络上被广泛询问的问题,但我似乎无法解决它.
我在一段时间后开始了一个项目,经过一个月的测试后,我遇到了"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;
}
Run Code Online (Sandbox Code Playgroud)
每次我在网站上做其他事情时,都会打开另一个连接,但不会关闭.我的代码有问题吗?如果没有,可能是什么问题?
Bal*_*usC 11
你的方法,连接将永远不会,如果被抛出的任何异常关闭之前将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;
}
Run Code Online (Sandbox Code Playgroud)
也就是说,此代码对SQL注入 攻击很敏感.用a PreparedStatement代替Statement.
另见:
| 归档时间: |
|
| 查看次数: |
10216 次 |
| 最近记录: |