关闭分配的实例变量
Closing assigned instance variable
我正在使用 java 和数据库。我有一个连接 class PgConnection 并且在这个 class 中我有一个私有连接变量
private Connection Con = null;
在构造函数中创建了连接
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 的特定实例,我就有了一个关闭 this.con
的 Close() 方法
谢谢
当然,如果您在打开连接的同一个方法中关闭连接,那么处理起来要安全得多,也更容易处理,因为这样您的方法就可以控制数据库连接的生命周期。如果可能的话,您的方法应始终使用 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
properly/at 正确时间点的危险。
一个您可能必须将生命周期控制权交给调用者的例子是,当您的 API 提供了几种操作数据库的方法并且可以以任意顺序调用时,所有操作都应该 运行 在同一个事务中/使用同一个连接。
想想在您的个人情况下使用两个单独的方法 open()
和 close()
相对于使用一个 perform()
方法的优势。如果有none,就简单一点!
是的,你每次都需要关闭连接,除非它的持久单元连接。
基本上你可以编写一个方法来为任何操作获取数据库连接,并且应该在你放置数据库相关内容的方法中关闭连接。
参考this link了解更多信息。
如果您在退出该方法之前关闭您的本地 conn
,您的本地 conn
引用的原始连接实例 con
也将关闭,您无法进行任何进一步的操作使用该连接。
主要考虑的一点是这里的conn
和con
指的是同一个Connection实例
我正在使用 java 和数据库。我有一个连接 class PgConnection 并且在这个 class 中我有一个私有连接变量
private Connection Con = null;
在构造函数中创建了连接
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 的特定实例,我就有了一个关闭 this.con
谢谢
当然,如果您在打开连接的同一个方法中关闭连接,那么处理起来要安全得多,也更容易处理,因为这样您的方法就可以控制数据库连接的生命周期。如果可能的话,您的方法应始终使用 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
properly/at 正确时间点的危险。
一个您可能必须将生命周期控制权交给调用者的例子是,当您的 API 提供了几种操作数据库的方法并且可以以任意顺序调用时,所有操作都应该 运行 在同一个事务中/使用同一个连接。
想想在您的个人情况下使用两个单独的方法 open()
和 close()
相对于使用一个 perform()
方法的优势。如果有none,就简单一点!
是的,你每次都需要关闭连接,除非它的持久单元连接。 基本上你可以编写一个方法来为任何操作获取数据库连接,并且应该在你放置数据库相关内容的方法中关闭连接。
参考this link了解更多信息。
如果您在退出该方法之前关闭您的本地 conn
,您的本地 conn
引用的原始连接实例 con
也将关闭,您无法进行任何进一步的操作使用该连接。
主要考虑的一点是这里的conn
和con
指的是同一个Connection实例