关闭已分配的实例变量

时间:2015-03-16 10:32:45

标签: java database postgresql jdbc

我正在使用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

由于

3 个答案:

答案 0 :(得分:0)

当然,如果在打开连接的同一方法中关闭连接,它会更安全,更容易处理,因为这样您的方法可以控制数据库连接的生命周期。如果可能,您的方法应始终使用try-with-resources statement,以确保即使出现异常也会关闭连接:

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()方法。如果没有,请保持简单!

答案 1 :(得分:0)

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

有关详细信息,请参阅this link

答案 2 :(得分:0)

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

需要考虑的要点是,此处conncon指的是同一个连接实例。