【问题标题】:Why are connections not getting closed?为什么连接没有关闭?
【发布时间】:2015-12-16 08:49:45
【问题描述】:

我有一个代码,我使用结果集连接到 db,然后在获得必要的值后在 finally 块中关闭连接。

但由于某种原因,查询仍在运行,连接池未释放。 有人可以在这里帮忙吗?

try {
 rsU = dbAccess.query(FasoCommon.sqlUpdatable, params, true);
if (rsU.next()) {
            updatable = rsU.getString("UpdatableFields");
            logger.info("UpdatableFields:: "+updatable);

            }
        }
finally {
        close(rsU, null, null);

}

private void close(ResultSet rs, Statement stmt, Connection conn) {
    if (rs != null) {
        try {
            rs.close();
            rs=null;
            //logger().info("ResultSet Closed : " + rs);
        } catch (SQLException e) {
            //logger().error("The result set cannot be closed.", e);
        }
    }
    if (stmt != null) {
        try {
            stmt.close();
            stmt=null;
            //logger().info("Statement Closed : " + stmt);
        } catch (SQLException e) {
            //logger().error("The statement cannot be closed.", e);
        }
    }
    if (conn != null) {
        try {
            conn.close();
            conn=null;
            //logger().info("Data Source Connection Closed : " + conn);
        } catch (SQLException e) {

        }
    }
} 

【问题讨论】:

  • 您可以在下面查看我的答案,并纠正您在此上下文中使用关键字结果集的问题。 ResultSet 是在执行查询时填充的对象。希望这可以帮助。检查此链接以了解更多信息:tutorials.jenkov.com/jdbc/resultset.html

标签: java sql database datasource resultset


【解决方案1】:

在 finally 块中,Connection 对象被作为 null 传递,甚至 Statement 对象也被作为 null 传递。

finally {
        close(rsU, null, null);

}

检查它们并传递这些对象引用,如果您有权访问它们并且 非空引用,传递给 close() 方法并检查。

【讨论】:

  • Connection 对象作为 null 传递 语句对象也作为 null 传递,因为我没有在这里创建语句对象。我正在传递一个 sql stmt 并使用向量参数传递多个参数并使用 sqldelegate 执行
  • 能否详细介绍一下sqldelegate?
【解决方案2】:

有一个 set 对象即使在关闭连接后仍保持对连接的引用。修复该部分解决了问题。

【讨论】:

    猜你喜欢
    • 2022-06-24
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多