这是我的问题:我知道这不是一个好主意,但是老师告诉我要使用singleton进行JDBC连接。
为什么数据库连接是非常昂贵的操作的理由,所以我不应该在每次需要对数据库进行操作时都连接到数据库。
但是如果我的代码看起来像这样,如何关闭连接?有什么选择?我一直在寻找解决问题的方法,但是找不到。
非常感谢! 我真的很感谢您的所有时间和精力。
public class DbConnect {
public static Connection con;
public static Statement st;
public static ResultSet rs;
public DbConnect() throws SQLException{
con = getDbConnection();
st = con.createStatement();
rs = null;
}
public static Connection getDbConnection(){
try{
Class.forName(("com.mysql.cj.jdbc.Driver"));
con = DriverManager.getConnection( ....
....
}
public static void closeConnection() throws SQLException{
con.close();
st.close();
rs.close();
}
//我如何使用它的示例:
public void removeCustomer(String value) throws SQLException{
String query="DELETE FROM customer WHERE idCustomer="+value;
pst=DbConnect.con.prepareStatement(query); // THIS
try {
pst.executeUpdate();
} catch (SQLException ex) {
Logger.getLogger(CustomerRemover.class.getName()).log(Level.SEVERE, null, ex);
} finally {
pst.close();
}
}
答案 0 :(得分:1)
您的老师应该查找连接池:)
他是正确的,使用身份验证和所有这些东西打开到数据库的连接非常昂贵。但是此问题已通过连接池解决。这样,数据库驱动程序将保持连接打开状态。
因此,您可以根据需要随意打开/关闭连接:打开连接将检查连接池中是否已经有连接打开,而关闭连接只会将连接放回连接池中。 / p>
重要的是,连接可能会超时。因此,如果您只是一直尝试保持一个连接处于打开状态,那么在尝试使用该连接时可能会遇到异常。 (某些驱动程序可以自动重新打开连接,但afaik多数不能。)
所以我的建议确实是:当您需要连接时,请打开它,使用它,然后再将其关闭。并确保使用连接池。
但是,如果您真的想要我们一个单身人士,请正确使用它。 Singleton类通常具有私有构造函数和用于获取实例的静态方法。实例是一个静态变量,可以在静态构造函数内部设置(因此它的定义类似于静态私有MyClass instance = new MyClass();),或者getInstance检查实例是否为null并根据需要创建第一个实例(使用同步万一多个线程尝试同时调用getInstance!)
答案 1 :(得分:1)
您的老师不正确。记住,您有两件事会占用资源。您的应用程序和数据库。所以, 1.始终使用“尝试使用资源”约定,以便正确关闭资源。我目睹了一家大型软件公司使用线程池进行JDBC连接。数据库大约两分钟无法访问,但是应用程序每次都尝试建立连接以创建新线程。这从根本上说是内存泄漏,并导致整个系统崩溃。尝试使用资源。 2.具有一个持久连接对于前端应用程序而言较便宜,但对于数据库而言则成倍地昂贵。常识基础要做的是尽可能快地连接,选择和关闭。