关闭特定数据库并关闭连接的正确方法是什么?

时间:2018-11-10 23:40:12

标签: java database-connection derby shutdown

我创建了以下三种方法,但对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);
    }        
    }

1 个答案:

答案 0 :(得分:2)

让我们从Derby documentation的开头开始:

  

关闭Derby或单个数据库

     

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

jdbc:derby:;shutdown=true
     

成功关闭总是会导致SQLException指示   Derby已关闭,也没有其他例外。

     

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

以此类推。


您的问题:

  

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

  • 因为文档中是这样说的。

  • 因为这是他们的实现方式。

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

  

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

给出最后一个,不。

  

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

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

但是,如果您的应用程序要在关闭数据库后继续运行,那无疑是明智的选择。

  

4)在关闭特定数据库后,如何重新建立连接?

大概是因为这样做是为了允许这样做。

  

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

(对此我不太确定。)

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

相比之下,关闭连接只会关闭服务器端和客户端上的那个连接。任何插座都应立即关闭。


  

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

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