java - DBCP 数据库连接未关闭

标签 java mysql

我当前正在创建一个在 MySQL 数据库上执行更新的应用程序。

我这里有以下代码:

public int execute(String script, Object... values) throws Exception
{

    Connection con = datasource.getConnection();
    PreparedStatement statement = null;
    int num = 0;

    try{
        try{
            statement = getConnection().prepareStatement(script);

            for (int i = 1; i <= values.length; i++)
            {
                statement.setObject(i, values[i - 1]);
            }

            num = statement.executeUpdate();

        }finally{
            if(statement != null) statement.close();
        }
    }finally{
        if(con != null) con.close();
    }

    return num;

}

查看数据库的进程列表后,很明显,直到整个数据源关闭后,连接才会关闭。

为什么连接没有关闭?

最佳答案

我不完全确定您的代码的结构,但我怀疑问题是您正在调用 getConnection().prepareStatement(script)。

您正在获取一个连接并将其分配给 con,并在最后关闭它。但是,从 getConnection() 的 Connection 返回的语句导致该连接保持打开状态。

您应该调用 con.prepareStatement(script)

您没有捕获异常或处理错误。您应该使用 Java 7 的 try-with-resources:

例如

public int execute(String script, Object... values) throws Exception {
    try (Connection con = datasource.getConnection();
            PreparedStatement statment = con.prepareStatement(script)) {

        for (int i = 1; i <= values.length; i++)
        {
            statement.setObject(i, values[i - 1]);
        }

        return statement.executeUpdate();
    } catch (SQLException ex) {
        // handleException
    }
}

这将确保错误得到处理并正确关闭所有资源。

关于java - DBCP 数据库连接未关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32210146/

相关文章:

mysql - 无法创建表。找不到原因

java - 数据截断 : Incorrect datetime value: '' for column 'date' at row 1

mysql - Left Join 在 150 000 行上花费很长时间

java - 如何使用 Java EE 流式传输实时音频视频?

Java Google Drive API 没有客户端 secret 或新项目

java - 无法在 Spring Boot 2.2 中设置命令行配置文件

C# 列表序列化 json 字符串

java - 如何优化 Oracle 11g 和 Hibernate 的批量 INSERT?

java - 如何将 javafx 正确导入 eclipse? ("The import cannot be resolved")

php - 将两个不同的查询合并为一个