2014-02-27 92 views
0

我正在開發基本上是安裝程序的應用程序。在啓動時創建一個HSQL數據庫,一個模式並插入一些數據。之後,如果滿足一些條件,我想完全刪除數據庫(包括文件),例如,如果由於某種原因安裝失敗。在我的特殊情況下,當用戶想要將應用程序安裝到已安裝應用程序的文件夾中時,必須發生錯誤。因爲HSQLDB已經存在,並且憑據已更改,所以在嘗試使用默認憑據連接到數據庫時,會在創建模式時發生錯誤。不能刪除HSQLDB文件

當我發現這個錯誤後,我遇到的問題是,當我嘗試刪除數據庫所在的目錄時,我得到一個錯誤,因爲.log文件被鎖定(並且它必須來自我正在運行的應用程序那是持有該​​鎖,但我不能爲什麼)。

這裏是得到授權錯誤之前執行的相關代碼:

private static void createDB(String dbName, String dbPath) { 

    Server server = new Server(); 
    server.setDatabaseName(0, dbName); 
    server.setDatabasePath(0, "file:" + dbPath); 
    server.setSilent(true); 
    server.setRestartOnShutdown(false); 
    server.signalCloseAllServerConnections(); 
    server.setNoSystemExit(true); 

    server.start(); 
    server.stop(); 
    server.shutdown(); 
} 

private static void createSchema() throws SQLException, FileNotFoundException, IOException { 

    Connection conn = null; 

    try { 
     conn = DBManager.getConnection(); <---- AUTH ERROR HAPPENS HERE! 
     ScriptRunner runner = new ScriptRunner(conn, true, true); 

     runner.runScript(new BufferedReader(new FileReader("someScript.sql"))); 
     runner.runScript(new BufferedReader(new FileReader("someScript.sql"))); 

    } finally { 
     DBUtils.closeQuietly(conn); 
    } 

} 

我趕上了權威性的異常後,我嘗試做刪除HSQLDB文件夾:

File directoryFile = new File(dirPathDB); 
org.apache.commons.io.FileUtils.deleteQuietly(directoryFile); 

但我得到一個錯誤,說「無法刪除文件somepath/somelogfile.log」 我不知道爲什麼會發生這種情況,因爲我終於在終止塊中的連接,無論是認證錯誤...

謝謝你,原諒我的英語!

回答

2

您無法刪除數據庫,因爲此時它已打開。

當存在現有安裝並且連接(即使使用錯誤的憑證)時,首先打開數據庫以檢查用戶名和密碼。如果檢查失敗,那麼數據庫不會像通常那樣嘗試連接正確的證書。

如果新安裝沒有完成,您應該使用具有管理員權限的帳戶執行SQL語句「SHUTDOWN」。這使您可以刪除數據庫。

+0

謝謝fredt!我現在明白髮生了什麼事情,但非常規我不能假定我知道已經安裝的數據庫的正確憑據,所以我不能發送關機命令,因爲我不能連接...你知道任何其他的替代方法嗎?爲了解決這個問題?謝謝! – Lucia

+0

無關緊要,我找到了解決方案,以適應我的具體情況,所以我不需要刪除數據庫:) – Lucia