我正在使用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
由于
答案 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
也将关闭,您无法使用该实例进行任何进一步的操作连接。
需要考虑的要点是,此处conn
和con
指的是同一个连接实例。