加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – MySql连接太多了

发布时间:2020-12-15 05:04:44 所属栏目:Java 来源:网络整理
导读:我讨厌提出一个在网络上被广泛询问的问题,但我似乎无法解决它. 我在一段时间后开始了一个项目,经过一个月的测试后,我遇到了“Too many connections”错误.我调查了它,并通过增加max_connections来“解决”它.然后这工作. 从那时起,越来越多的人开始使用它,它
我讨厌提出一个在网络上被广泛询问的问题,但我似乎无法解决它.

我在一段时间后开始了一个项目,经过一个月的测试后,我遇到了“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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读