在销毁对象之前清理Java资源

时间:2018-06-22 09:41:23

标签: java sql database destructor resource-cleanup

我遇到了以下问题,我知道已经有很多问题了,但是这些问题都没有给我一个令人满意的答案!我用C ++写了很多东西,这种语言提供了一个析构函数,而Java并不是因为垃圾回收。

关于我的情况的一些简介:我编写了一个访问本地Sqlite3数据库的软件。我编写了一个中央单例类来访问该数据库。其他多个类通过此包装器类访问数据库。这是该包装器类的伪代码:

public class MyDbWrapper
{
    private currentDbConnection;

    public MyDbWrapper(dbPath)
    {
        // Open the database connection with given path
    }

    public readFromDb()
    {
        ... // Uses the class member currentDbConnection
    }

    public writeToDb()
    {
        ... // Uses the class member currentDbConnection
    }

    public closeDb()
    {
        ...
    }
}

现在我的问题是,如何在退出应用程序之前确保关闭数据库连接?是的,我已经实现了AutoCloseable接口,是的,我已经使用try-with-resources做了大量工作,但是由于有多个类的访问,所以这实际上不是一个选择! 在C ++中,析构函数可以解决此问题,但是在Java中,方法finalize可能的“等效”已被弃用

那么还有其他选择,还是应该完全重新设计完整的包装器?如果是,那么每次重新打开数据库时,如何避免由于大量读写访问而导致的性能问题?

1 个答案:

答案 0 :(得分:1)

就像Joker_vD所说的那样,我通过在程序的主要方法中使用try-with-resources语句解决了这个问题...

public static void main(String [] args)
{
    try(MyDbWrapper wrapper = new MyDbWrapper())
    {
        // Execute other task with usage of the database wrapper
    }
}

使用此解决方案,不需要解扰器或不赞成使用的方法finalize(),如果程序结束,数据库连接将关闭...

再次感谢您,并记入Joker_vD