当前位置: 首页 > 面试题库 >

重用PreparedStatement时可能发生资源泄漏?

公冶麒
2023-03-14
问题内容

假设您有以下代码:

    Connection connection = null;
    PreparedStatement ps = null;

    try {
        Connection = connectionFactory.getConnection();

        ps = statement.prepareStamement(someQuery);
        // execute and read and stuff

        // now you want to use the ps again, since you don't want ps1, ps2, ps3, etc.
        ps = statement.prepareStatement(someOtherQuery); // DOES THIS FORM A POTENTIAL LEAK?
    } catch (a lot of exceptions) {
        // process exceptions
    } finally {

        // close the resources (using util class with null-checks and everything)
        SomeUtilClass.close(ps);
        SomeUtilClass.close(connection);
    }

重用ps变量是否有潜在的泄漏?

如果是这样,我不希望声明多个此类准备好的语句(ps1,ps2,ps3等)。我应该如何重构呢?

有人在想吗?

编辑

收到几个答案,说明这无关紧要。我想指出的是,我遇到的游标保持打开状态的时间过长,并且想知道该模式是否与此有关。

我的想法是:

第一条语句被取消引用并进行了GC处理,因此在此示例中,如何关闭第一个PreparedStatement(在数据库方面)?


问题答案:

这不一定会产生经典的“永久”意义上的泄漏。垃圾收集器最终将到达准备好的语句的第一个实例,并调用其终结器。

但是,这不是让垃圾收集器处理释放潜在的关键资源(例如DB句柄)的好习惯:您应该close在重用已准备好的语句变量之前调用该方法,或者根本不要重用该变量。

try {
    Connection = connectionFactory.getConnection();

    ps = statement.prepareStamement(someQuery);
    // execute and read and stuff

    // now you want to use the ps again, since you don't want ps1, ps2, ps3, etc.
    // v v v v v v v v v v v
    SomeUtilClass.close(ps);
    // ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
    ps = statement.prepareStatement(someOtherQuery); // DOES THIS FORM A POTENTIAL LEAK?
} catch (a lot of exceptions) {
    // process exceptions
} finally {

    // close the resources (using util class with null-checks and everything)
    SomeUtilClass.close(ps);
    SomeUtilClass.close(connection);
}


 类似资料:
  • Eclipse显示警告消息,表示"资源泄漏,准备好的语句未在以下位置关闭" 在我看来,finally块负责关闭preparedstatement和rs对象。你知道为什么eclipse还在抱怨资源泄漏吗?

  • 问题内容: 这个问题已经在这里有了答案 : MySQLSyntaxErrorException在“?”附近 尝试执行PreparedStatement时 (2个答案) 2年前关闭。 我尝试使用JDBC使用PreparedStatement通过以下方法插入userId(int)和userName(String): 我得到以下堆栈跟踪: 我究竟做错了什么? 问题答案: 试试这个,这应该工作: Prep

  • 我正在编写一个程序,希望控制台输出用户输入的数字的剩余部分。但是,每次我编译代码时,控制台都会打印出来,我得到以下控制台错误: 我不确定控制台所说的“资源泄漏”是什么意思。我在几个不同的地方查找过它(包括API和其他堆栈溢出问题),我不确定为什么没有打印到控制台。我正在使用DrJava程序,以防有人想知道。 这里是我的代码供参考:

  • 我有一个名为的类,它扩展了接口和。但是,当我使用该类并且不调用其方法时,不会触发资源泄漏的警告。我有另一个名为的类,它有一个名为的方法,该方法返回一个对象。当我以以下方式创建新的对象时,不会触发任何资源泄漏警告: 为什么这里没有触发资源泄漏的警告,因为从未关闭?这里的答案是,触发它所需要的只是实现接口,但我的类同时实现了和,但在未关闭时不会触发任何警告。

  • 我正在看一些Java教程,对使用扫描器时的资源泄露警告感到疑惑。 我知道我可以关闭它,但视频中的人没有得到警告,即使他使用的是完全相同的代码,为什么呢?

  • Eclipse Java警告:资源泄漏:“Unassigned Closeable Value”从不关闭 漏在哪里?