gpt4 book ai didi

Java Finalize 和 DB 连接管理

转载 作者:行者123 更新时间:2023-12-01 13:28:34 26 4
gpt4 key购买 nike

关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。












想改进这个问题?将问题更新为 on-topic对于堆栈溢出。

8年前关闭。




Improve this question




我阅读了关于 Java 对象最终确定和不愿使用它的可用线程,但我仍然想知道它是否不是管理数据库连接生命周期的最佳方法。

有问题的2个线程:

  • When is the finalize() method called in Java?
  • Why would you ever implement finalize()?

  • 这些线程的底线是不建议使用 finalize ,原因有以下 2 个(这些是说服我的主要原因):
  • Finalize 不保证会被调用
  • Finalize() 对对象的创建和收集施加了性能损失。请参阅此处的 Brian Goetz 文章:http://www.ibm.com/developerworks/java/library/j-jtp01274.html

  • 然而,在第一个线程上,有一个对我来说似乎很关键的引述:“finalize 应该只用于清理(通常是非 Java)资源”。数据库连接是一种资源,它似乎应该使用 finalize 来释放,如下所示:
    public class DBManager {

    /**
    * The connection to the database
    */
    private Connection mConnection;

    public void initialize() throws Exception{

    // Driver
    Class.forName("org.h2.Driver");
    mConnection = DriverManager.getConnection("jdbc:h2:mem:test", "sa", "");

    ....

    }


    @Override
    protected void finalize() throws Throwable {
    // TODO Auto-generated method stub
    super.finalize();
    try {

    // Closing the connection
    mConnection.close();

    } catch (Exception e) {
    // TODO: handle exception
    }
    }

    }

    现在你可能会争辩说我应该在这个类中有一个 close 方法,该方法将在我的应用程序结束时调用,这意味着要弄清楚我的应用程序在哪里关闭,如果它是独立应用程序或运行,这可能会有所不同一个容器内。 Finalize() 确实提供了这种灵 active ,您不需要关闭连接。就我而言,我在 Spring 下运行,我什至不知道那个关闭处理程序在哪里(我根本不认为自己是 Spring 专家)。

    我拒绝的另一个潜在论点是,如果要处理应用程序关闭用例,我为什么要关心清理状态。答案是我认为不清理状态是不专业的,其次配置文件和泄漏工具将报告那些永远不会导致明确泄漏报告的泄漏,并且对于使用我的对象的每个应用程序或测试。

    上面的数据库连接用例是否适合最终确定?如果不是,应该如何管理这样的对象?

    最佳答案

    回答
    使用经过充分测试的正确 ConnectionPool如果您不知道处理资源管理的正确方法,请让它完成它的工作,这是 solved problem !
    Java 不是 C++
    不保证会调用 finalize 方法 - 永远! finalize()应该被认为实际上没有做任何事情,因为它不能保证它会在应用程序的生命周期中被调用。
    如果你不能深信事实上,方法是 不保证会被调用 , 是不依赖它清理资源从而造成非确定性资源泄漏的一个很好的理由,我不知道会发生什么!

    关于Java Finalize 和 DB 连接管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21682554/

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