【问题标题】:What is the proper way to shutdown a specific db and close the connection?关闭特定数据库并关闭连接的正确方法是什么?
【发布时间】:2019-04-14 03:09:38
【问题描述】:

我创建了以下三种方法,但对 shutDownDB() 的真正作用感到困惑。以下是我的问题:

  1. 为什么我需要一个活动连接来关闭特定数据库?
  2. 关闭连接然后关闭数据库不是更有意义吗
  3. 如果特定数据库关闭,为什么我需要关闭连接?
  4. 为什么我可以在特定数据库关闭后重新建立连接?
  5. 关闭特定数据库和关闭连接之间的实际区别是什么?

注意:在嵌入式模式下使用 derby

    public static Connection openDB(String dbFolderString) {
    Connection conn = null;
    try{ 
        File dbFolder = new File(dbFolderString);
        String URL = "jdbc:derby:" + dbFolderString + ";create=true"; 
        if(print)System.out.println("\n" + "db exists " + dbFolder.exists());

        conn = DriverManager.getConnection(URL);            
        if(print)System.out.println("Succesfully connected to " + dbFolderString);            
    }catch(SQLException e){
        System.out.println("FATAL ERROR: from getDB " + e);
        System.exit(0);            
    } 
    return conn;
    }   

    public static boolean shutDownDB(Connection conn) { 
    //shutsdown a specific database but DOES NOT SHUTDOWN DERBY
    try{
        String[] tokens;
        String url = conn.getMetaData().getURL(); 
        tokens = url.split(":");
        DriverManager.getConnection("jdbc:derby:" + tokens[2] +";shutdown=true");                      
    }catch(SQLException e1){
        if(e1.getSQLState().equals("08006") && e1.getErrorCode() == 45000){
            if(false)System.out.println(e1.getSQLState() + "  " + e1.getErrorCode());
            if(print)System.out.println("\n" + "Database shutdown successful"); 
        }else{
            System.out.println(e1.getSQLState() + "  " + e1.getErrorCode());
            System.out.println("FATAL ERROR: Database not shutdown  " + e1);
            System.exit(0);
        }
    }
    return true;
    }    

    public static void closeConnection(Connection conn){
    try{ 
        conn.close();
        if(print)System.out.println("Connection closed");
    }catch(SQLException e){            
        System.out.println("connection NOT closed " + e);
        System.exit(0);
    }        
    }

【问题讨论】:

    标签: java database-connection derby shutdown


    【解决方案1】:

    让我们从Derby documentation 所说的开始:

    关闭 Derby 或单个数据库

    嵌入式环境中的应用程序通过以下方式关闭 Derby 系统 在连接 URL 中指定 shutdown=true 属性。关闭 关闭系统,您没有指定数据库名称,并且您没有 通常指定任何其他属性。

    jdbc:derby:;shutdown=true
    

    成功关闭总是会导致 SQLException 指示 德比已经停摆,没有其他例外。

    如果您在系统级别启用了用户身份验证,您将 需要按顺序指定凭据(即用户名和密码) 关闭 Derby 系统,以及提供的用户名和密码 也必须在系统级别定义。

    等等。


    您的问题:

    1) 为什么我需要一个活动连接来关闭特定数据库?

    • 因为文档是这样说的。

    • 因为他们就是这样实现的。

    • 因为关闭数据库(通常)需要用户 认证和连接建立是用户的地方 进行身份验证。

    2) 关闭连接然后关闭数据库不是更有意义吗?

    考虑到最后一个,没有。

    3) 如果特定数据库关闭,为什么我需要关闭连接?

    如果您的应用程序能够应对潜在的资源泄漏,您不需要需要;例如客户端可能尚未关闭的套接字。

    但如果您的应用程序想要在关闭数据库后继续运行,这当然是可取的。

    4) 关闭特定数据库后,我怎么能重新建立连接?

    大概是因为它被设计为允许这样做。

    5) 关闭特定数据库和关闭连接之间的实际区别是什么?

    (我对此并不完全确定......)

    关闭数据库将使特定数据库的所有连接无效。它不会在客户端关闭它们,因此套接字可能会保持打开状态......直到使用相应集合的应用程序部分尝试使用它们,发现它们“死”并关闭它们。

    相比之下,关闭连接只会关闭那个连接,无论是在服务器端还是客户端。任何套接字都应立即关闭。


    注意:在嵌入式模式下使用 derby

    文档没有区分嵌入式和非嵌入式模式。

    【讨论】:

    • 精彩的答案!一个轻微的改进是关于数据库是否需要在重新启动后执行事务恢复的细节。如果所有连接都已关闭,则不需要撤消任何事务,但可能需要重做一些事务。如果数据库本身完全关闭(这不仅仅是关闭所有连接),则可以避免 redo 恢复。
    猜你喜欢
    • 2011-03-21
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    相关资源
    最近更新 更多