微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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
> Sun JDBC tutorial: introduction
> Sun JDBC tutorial: how to use PreparedStatement
> DAO tutorial: how to use basic JDBC code properly

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐