如何使用单例设计模式建立和关闭JDBC连接?

时间:2019-05-17 20:36:51

标签: java jdbc

这是我的问题:我知道这不是一个好主意,但是老师告诉我要使用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();
        }

}

2 个答案:

答案 0 :(得分:1)

您的老师应该查找连接池:)

他是正确的,使用身份验证和所有这些东西打开到数据库的连接非常昂贵。但是此问题已通过连接池解决。这样,数据库驱动程序将保持连接打开状态。

因此,您可以根据需要随意打开/关闭连接:打开连接将检查连接池中是否已经有连接打开,而关闭连接只会将连接放回连接池中。 / p>

重要的是,连接可能会超时。因此,如果您只是一直尝试保持一个连接处于打开状态,那么在尝试使用该连接时可能会遇到异常。 (某些驱动程序可以自动重新打开连接,但afaik多数不能。)

所以我的建议确实是:当您需要连接时,请打开它,使用它,然后再将其关闭。并确保使用连接池。

但是,如果您真的想要我们一个单身人士,请正确使用它。 Singleton类通常具有私有构造函数和用于获取实例的静态方法。实例是一个静态变量,可以在静态构造函数内部设置(因此它的定义类似于静态私有MyClass instance = new MyClass();),或者getInstance检查实例是否为null并根据需要创建第一个实例(使用同步万一多个线程尝试同时调用getInstance!)

答案 1 :(得分:1)

您的老师不正确。记住,您有两件事会占用资源。您的应用程序和数据库。所以, 1.始终使用“尝试使用资源”约定,以便正确关闭资源。我目睹了一家大型软件公司使用线程池进行JDBC连接。数据库大约两分钟无法访问,但是应用程序每次都尝试建立连接以创建新线程。这从根本上说是内存泄漏,并导致整个系统崩溃。尝试使用资源。 2.具有一个持久连接对于前端应用程序而言较便宜,但对于数据库而言则成倍地昂贵。常识基础要做的是尽可能快地连接,选择和关闭。