Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java和DB连接管理_Java - Fatal编程技术网

Java和DB连接管理

Java和DB连接管理,java,Java,我阅读了关于Java对象终结和不愿意使用它的主题的可用线程,但我仍然怀疑这是否是管理DB连接生命周期的最佳方法,例如 有问题的两个线程: 这些线程的底线是不建议使用finalize,原因如下(这些是说服我的主要原因): Finalize不保证被调用 Finalize()对对象的创建和收集施加性能惩罚。请参见Brian Goetz的文章: 然而,在第一个线程中,有一句话似乎对我很关键:“finalize应该只用于清理(通常是非Java)资源”。DB连接是一种资源,似乎应该使用finalize释

我阅读了关于Java对象终结和不愿意使用它的主题的可用线程,但我仍然怀疑这是否是管理DB连接生命周期的最佳方法,例如

有问题的两个线程:

  • 这些线程的底线是不建议使用finalize,原因如下(这些是说服我的主要原因):

  • Finalize不保证被调用
  • Finalize()对对象的创建和收集施加性能惩罚。请参见Brian Goetz的文章:
  • 然而,在第一个线程中,有一句话似乎对我很关键:“finalize应该只用于清理(通常是非Java)资源”。DB连接是一种资源,似乎应该使用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()提供了这种灵活性,您不需要关闭连接。在我的例子中,我在Spring下运行,我甚至不知道那个关机处理器在哪里(我根本不认为自己是一个弹簧专家)。 我拒绝的另一个潜在论点是,如果要处理应用程序关闭用例,我为什么要关心清理状态。答案是,我认为不清理状态是不专业的,其次,profile and leak tool将报告这些泄漏,这些泄漏永远不会导致清晰的泄漏报告,并且对于使用我的对象的每个应用程序或it测试都会报告

    上面的DB连接用例是否适合最终确定?如果不是,该如何管理该对象?

    回答 使用经过良好测试的正确的
    连接池
    实现,并让它完成它的工作。如果您不知道处理资源管理的正确方法,这是一个

    java不是C++ finalize方法不能保证永远被调用-永远

    finalize()


    如果你不能确信一个方法不一定会被调用,这是一个不依赖它清理资源从而造成不确定性资源泄漏的好理由,我不知道会发生什么

    不专业的做法是使用
    Class.forName()
    ,而不是使用真正的数据库连接池来为您处理所有这些。stackoverflow不供讨论,这篇文章的内容不是关于使用数据库连接池,也不是为了讨论这个问题。我也没有征求意见。至于讨论本身,我要问的是开发人员在开发DB连接过程中可能会遇到的一个实际问题。我提供代码并不是为了让讨论仅仅停留在理论层面,而是为了从中汲取良好的开发人员实践,这正是stackoverflow的目的之一。这样的反应会扼杀讨论,阻止其他人参与建设性的讨论。本网站不是论坛,不是供讨论的,讨论完全是离题的,而且一直如此,这里没有问题。。。阅读常见问题。您已经有了答案,不要使用finalize()进行任何操作!根据OP自己的评论,我不得不同意投票结果,因为他实际上同意这是离题的,因为他强调这是为了讨论最佳实践。Stack Overflow是一个问答资源,用于回答关于编码的特定问题,而不是讨论论坛。关于设计概念的讨论更适合程序员。stackexchange.com。请阅读此文以了解更多信息:您能清楚地说明哪些情况下不会调用它吗。这些案例似乎与循环引用有关。JVM中必须有一个确定性案例的列表,在这些案例中,它将发生,并且它是为什么而设计的,我问JVM的设计者在设计它时是怎么想的,我的用例是否适合它。它不适合,因为它可能永远不会被调用,这在互联网上有很好的记录,一个现代化的搜索将揭示几十篇关于为什么这种方法在所有实际用途中都被弃用的文章。