首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用单例设计模式建立和关闭JDBC连接?

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

Stack Overflow用户
提问于 2019-05-18 04:36:51
回答 2查看 242关注 0票数 0

这就是我的问题:我知道这不是一个很好的实践,但是老师告诉我使用单例进行JDBC连接。

为什么数据库连接是非常昂贵操作,因此我不应该在每次需要对数据库执行操作时都连接到数据库。

但是,如果我的代码看起来像这样,我如何关闭连接呢?有哪些选择?我正在寻找我的问题的解决方案,但我找不到一个。

非常感谢!我真的很欣赏你所有的时间和努力。

代码语言:javascript
复制
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();
}

//使用示例:

代码语言:javascript
复制
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();
        }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-18 11:11:52

你的老师是错误的。请记住,您有两个使用资源的东西。您的应用程序和数据库。因此,1.始终使用Try With Resources约定,这样您的资源才能正确关闭。我亲眼目睹了一家大型软件公司使用线程池建立JDBC连接。数据库在大约两分钟内不可访问,但应用程序一直在尝试建立连接,每次都会创建一个新线程。这必然是一个内存泄漏,并导致整个系统崩溃。对资源使用try。2.对于前端应用程序来说,拥有一个持久连接的代价较低,但对于数据库来说,它的代价却是指数级的。要做的基本常识是尽可能快地连接、选择和关闭。

票数 1
EN

Stack Overflow用户

发布于 2019-05-18 04:50:25

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

他是正确的,打开一个连接到数据库的身份验证和所有这些东西是相当昂贵的。但是这个问题可以通过连接池来解决。这样,数据库驱动程序就负责保持连接打开。

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

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

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

但是如果你真的想给我们一个单例,那就正确地使用它。Singleton类通常有一个私有构造函数和一个静态方法来获取实例。实例是一个静态变量,它是在静态构造函数中设置的(因此它的定义类似于static private MyClass instance = MyClass();)或者getInstance检查该实例是否为空,并在需要时创建第一个实例(如果多个线程试图同时调用getInstance,则使用synchronized!)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56193251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档