2011-05-18 65 views
7

我想從我的Java應用程序以默認端口在網絡服務器模式下啓動Derby。服務器啓動成功。現在我嘗試連接到服務器上的一個名爲'myDB'的數據庫。連接建立並且db.lck被成功創建。然後,我做一些事務,優雅地提交併關閉連接。我看到db.lck仍然存在。然後關閉網絡服務器。我希望在所有這些操作結束時刪除db.lck文件。但它仍然存在。 (PS:操作系統是Windows)關閉derby網絡服務器不刪除db.lck

以下是代碼:

1)啓動服務器:

System.setProperty("derby.system.home", "C:\\SI\\testDerby"); 
System.setProperty("derby.drda.traceDirectory", "C:\\SI\\trace"); 
System.setProperty("derby.drda.traceAll", "true"); 
System.setProperty("derby.drda.logConnections", "true"); 
System.setProperty("derby.connection.requireAuthentication", "false"); 

serverHandle = new NetworkServerControl(); 
// Write server console messages to system output 
serverHandle.start(new PrintWriter(System.out)); 

2)連接到DB

final String PORT = 1527; 
String driver = "org.apache.derby.jdbc.ClientDriver"; 
String dbName = "myDB"; 
String connectionURL = "jdbc:derby:" + "//localhost:" 
      + PORT + "/" + dbName + ";create=true"; 
Class.forName(driver).newInstance(); 
Connection conn = DriverManager.getConnection(connectionURL); 
Statement stmt = conn.createStatement(); 
boolean success = stmt.execute("DROP TABLE USERS"); 
PreparedStatement statement = conn.prepareStatement("CREATE TABLE USERS (id BIGINT not null, name VARCHAR(20))"); 
success = statement.execute(); 
conn.commit(); 
conn.close(); 

3)關閉服務器

serverHandle.shutdown(); 

Can anyon請幫我解決這個問題嗎?當我關閉連接或關閉數據庫時,我需要刪除db.lck文件。我想我錯過了一些東西。提前致謝。

回答

2

也許關閉服務器不會關閉數據庫;請嘗試在關閉服務器之前執行明確的數據庫關閉,如下所述:http://db.apache.org/derby/docs/10.8/devguide/tdevdvlp40464.html#tdevdvlp40464

+0

感謝您的回覆。我認爲關閉URL中提到的數據庫的方法僅適用於嵌入式德比而不適用於網絡服務器。我嘗試了與網絡服務器相同的方式(即,在URL中附加了「; shutdown = true」的getConnection)。我以一個SQLNonTransientConnectionException作爲根本原因: 引起:org.apache.derby.client.am.SqlException DERBY SQL錯誤:SQLCODE:-1,SQLSTATE:08006,SQLERRMC:數據庫'myDB'關閉。 – 2011-05-19 04:53:12

+1

但是,在這種情況下,鎖文件被刪除。任何想法爲什麼它在這裏拋出異常? – 2011-05-19 04:54:48

+2

這就是德比的行爲方式。關閉數據庫會引發異常。這有點尷尬,但SQLSTATE非常可識別,所以我建議你簡單地捕捉並忽略該異常。 – 2011-05-19 21:47:14