繁体   English   中英

关闭分配的实例变量

[英]Closing assigned instance variable

我正在使用Java和数据库。 我有一个连接类PgConnection,在这个类中,我有一个私有的连接变量

private Connection Con = null;

在构造函数中创建Connection

Properties props = new Properties();
    props.load(Thread.currentThread().getContextClassLoader()
            .getResourceAsStream("database.properties"));

    String url = props.getProperty("db.url");
    String user = props.getProperty("db.user");
    String passwd = props.getProperty("db.passwd");

    Class.forName("org.postgresql.Driver");
    this.con = DriverManager.getConnection(url, user, passwd);

当在我的代码中使用这个con变量时,我一直在通过将其分配给函数内的局部变量来引用它Connection conn = this.con;

这是正确的做法吗? 如果是这样,我是否应该在退出函数之前关闭conn 完成PgConnection的特定实例后,我就有一个Close()方法来关闭this.con

谢谢

当然,如果在打开连接的同一方法中关闭连接,则安全得多,而且操作起来也更容易,因为这样您的方法就可以控制数据库连接的生命周期。 如果可能的话,您的方法应始终使用try-with-resources语句 ,以确保即使在发生异常的情况下也可以关闭连接:

public void performDatabaseOperation(...) {
    // initialize properties here, load driver etc. here

    try (Connection con = DriverManager.getConnection(url, user, pwd)) {
        // use connection.
        // it will be closed automatically at the end of this code block
        // even if exceptions occure!
    }
}

当然,如果您希望对调用代码进行更多控制,则可以使用上述方法将连接打开与关闭分开。 但是请记住,这将导致状态以及调用代码无法正确/在正确的时间点close的危险。

当您的API提供几种对数据库进行操作并且可以按任意顺序调用的方法时,您可能必须给调用者提供生命周期控制的一个示例,并且所有操作应在同一事务内/使用同一连接运行。

只需考虑一下在您的个别情况下使用两个单独的方法open()close()相反的优点,即只使用一个perform()方法。 如果没有,请保持简单!

是的,您需要每次都关闭连接,除非它具有持久性单元连接。 基本上,您可以编写一种方法来获取任何操作的数据库连接,并且应该在放置数据库相关内容的方法内部关闭连接。

请参阅此链接以获取更多信息。

如果在退出方法之前关闭本地conn ,则本地conn引用的原始Connection实例con也将被关闭,并且您无法使用该连接进行任何进一步的操作。

要考虑的主要点是,此处conncon指的是同一Connection实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM