我创建了以下三种方法,但对shutDownDB()的实际用途感到困惑。这是我的问题:
注意:在嵌入式模式下使用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);
}
}
答案 0 :(得分:2)
让我们从Derby documentation的开头开始:
关闭Derby或单个数据库
嵌入式环境中的应用程序通过以下方式关闭了Derby系统: 在连接URL中指定shutdown = true属性。关闭 系统下,您没有指定数据库名称,并且您没有 通常指定其他任何属性。
jdbc:derby:;shutdown=true
成功关闭总是会导致SQLException指示 Derby已关闭,也没有其他例外。
如果您已在系统级别启用用户身份验证,则将 需要按顺序指定凭据(即用户名和密码) 关闭Derby系统以及提供的用户名和密码 还必须在系统级别定义。
以此类推。
您的问题:
1)为什么我需要活动连接才能关闭特定数据库?
因为文档中是这样说的。
因为这是他们的实现方式。
因为关闭数据库(通常)需要用户 身份验证和连接建立是用户使用的地方 进行身份验证。
2)关闭连接然后关闭数据库不是更有意义吗?
给出最后一个,不。
3)如果关闭了特定的数据库,为什么需要关闭连接?
您不需要您的应用程序是否可以应对潜在的资源泄漏;例如客户端上可能尚未关闭的套接字。
但是,如果您的应用程序要在关闭数据库后继续运行,那无疑是明智的选择。
4)在关闭特定数据库后,如何重新建立连接?
大概是因为这样做是为了允许这样做。
5)关闭特定的数据库与关闭连接之间的实际区别是什么?
(对此我不太确定。)
关闭数据库将使该特定数据库的所有连接无效。它不会在客户端关闭它们,因此套接字有可能保持打开状态....,直到您使用相应集合的应用程序部分尝试使用它们,发现它们“已死”并关闭它们。 / p>
相比之下,关闭连接只会关闭服务器端和客户端上的那个连接。任何插座都应立即关闭。
注意:在嵌入式模式下使用derby
文档没有区分嵌入式和非嵌入式模式。