MySql连接太多了

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.

另见: