gpt4 book ai didi

java - 为什么在 Java 中 GC 时 MySQL 的PreparedStatements 不会自动关闭?

转载 作者:行者123 更新时间:2023-11-29 21:01:12 25 4
gpt4 key购买 nike

在我早期的 Java Web 应用程序中,我会在每个请求结束时关闭连接。我不会关闭 ResultSetPreapredStatement,因为它们会在 Connection 关闭时自动关闭。

但是,我的一些应用程序必须在循环中创建许多 PreparedStatement。因此,如果我没有单独关闭它们,我会在请求完成之前收到OutOfMemory错误。似乎每个 Connection 都保留对其所有 PreparedStatement 的引用。

我习惯了当变量变得不可访问(即子例程返回)时 Perl 自动清理语句($sth)。如果当我调用 $dbh->disconnect$sth 仍然可以访问,那么我必须调用 $sth->finish,但大多数时候它在我的脚本末尾无法访问,而且没有必要。

我认为 Java 可以使用 finalize 方法并可能使用 WeakReference 为开发人员提供类似的便利。当所有引用都消失且对象不可访问时,将调用 Finalize 方法。 (除了使用弱引用)

  1. 这是否是自动关闭 PreparedStatement 的合理解决方案?如果是这样,我计划创建包装函数以在我的应用程序中实现此类自动化。如果这不是一个合理的解决方案,请解释。

  2. 可能的副作用是什么,阻碍了 MySQL-Java Connector 的设计者的设计。 (一个 JDBC 驱动程序)是否将这种自动化纳入其原始设计?

  3. 我能想到的唯一副作用是 MySQL 服务器本身的内存开销。但是,我不知道当 PreparedStatement 保持打开状态时 MySQL 服务器是否有任何开销。 MySQL 中是否有任何内存开销?

最佳答案

finalize 方法在 JVM 决定需要时运行 - 当对象超出范围时,它可能运行也可能不运行。例如,它与 C++ 析构函数不同。您不需要在循环中创建PreparedStatements - 重点是它们是“准备好的”并且可以多次使用。这并不意味着它应该永远存在,但如果在您的示例中需要循环某些内容,则应该重用它。

简而言之 - 永远不要指望最终确定。如果您打开某些东西,请关闭它。如果可能的话,在新代码中使用 AutoClosable 接口(interface),这样您就不必担心它。

关于java - 为什么在 Java 中 GC 时 MySQL 的PreparedStatements 不会自动关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37215222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com