这就是我的问题:我知道这不是一个很好的实践,但是老师告诉我使用单例进行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();
}
}发布于 2019-05-18 11:11:52
你的老师是错误的。请记住,您有两个使用资源的东西。您的应用程序和数据库。因此,1.始终使用Try With Resources约定,这样您的资源才能正确关闭。我亲眼目睹了一家大型软件公司使用线程池建立JDBC连接。数据库在大约两分钟内不可访问,但应用程序一直在尝试建立连接,每次都会创建一个新线程。这必然是一个内存泄漏,并导致整个系统崩溃。对资源使用try。2.对于前端应用程序来说,拥有一个持久连接的代价较低,但对于数据库来说,它的代价却是指数级的。要做的基本常识是尽可能快地连接、选择和关闭。
发布于 2019-05-18 04:50:25
您的老师应该查找连接池:)
他是正确的,打开一个连接到数据库的身份验证和所有这些东西是相当昂贵的。但是这个问题可以通过连接池来解决。这样,数据库驱动程序就负责保持连接打开。
因此,您可以根据需要打开/关闭连接:打开连接将检查连接池中是否已有打开的连接,而关闭连接只会将连接放回连接池。
重要的是,连接可能会超时。因此,如果您只是试图始终保持一个连接处于打开状态,则在尝试使用该连接时可能会出现异常。(一些驱动程序可以自动重新打开连接,但afaik大多数驱动程序不能。)
所以我的建议是:当你需要连接时,打开它,使用它,然后关闭它。并确保使用连接池。
但是如果你真的想给我们一个单例,那就正确地使用它。Singleton类通常有一个私有构造函数和一个静态方法来获取实例。实例是一个静态变量,它是在静态构造函数中设置的(因此它的定义类似于static private MyClass instance = MyClass();)或者getInstance检查该实例是否为空,并在需要时创建第一个实例(如果多个线程试图同时调用getInstance,则使用synchronized!)
https://stackoverflow.com/questions/56193251
复制相似问题