2012-09-22 32 views
0

我想在我開發的一個我的桌面應用程序之一添加一個「創建備份」選項。我已經搜尋了很多關於這方面的信息,並找到了解決這個問題的一些方法,但是它們都破壞了一個重要的概念「可移植性」。許多人建議使用mysqldump.exe(在Windows中)來做到這一點,但我想我需要知道mysql安裝文件夾才能採取這種方法。以下是推薦的代碼的方式未能正常運行(我不知道爲什麼,請告訴我,如果你發現真正的原因)備份mysql數據庫而不會丟失與java的可移植性

private static String dbName = "shams"; 
private static String dbUserName = "root"; 
private static String dbPassword = ""; 

public static boolean backupDB(File file) { 
    String path = file.getPath(); 
    if (!path.contains(".sql")) { 
     file = new File(path +".sql"); 
    } 

    String executeCmd = "mysqldump -u " + dbUserName + " -p" + dbPassword + " --add-drop-database -B " + dbName + " -r " + file.getPath(); 
    Process runtimeProcess; 
    try { 

     runtimeProcess = Runtime.getRuntime().exec(executeCmd); 
     int processComplete = runtimeProcess.waitFor(); 

     if (processComplete == 0) { 
      System.out.println("Backup created successfully"); 
      runtimeProcess.destroy(); 
      return true; 
     } else { 

      System.out.println("Could not create the backup"); 
     } 


    } catch (Exception ex) { 
     ex.printStackTrace(); 


    } 

    return false; 
} 

和一些建議簡單地將數據庫複製到某個位置。

so ...我應該怎樣做才能以一種整潔的方式?任何第三方jar可用?

--edit ---

與給定的代碼問題是,當你沒有一個用戶的密碼(在這種情況下,root用戶),您不應該提及您的命令的密碼。該命令應該是這樣的:String executeCmd = "mysqldump -u " + dbUserName + " --add-drop-database -B " + dbName + " -r " + file.getPath();

並且您也不需要指定mysql安裝文件夾。上面的代碼按原樣運行。

+0

你是什麼意思「破壞可移植性」?你看到了哪些例子,它們是如何「破壞可移植性」的? – Nanne

+0

我已經提到了示例代碼。你可以看到我們需要知道mysql的安裝文件夾才能執行mysqldump命令。 「知道安裝文件夾」意味着失去可移植性。 – MoienGK

+0

你可以這麼說。 (或者我應該說「你是這麼說的?」)。但是,如果你對'個人'mysql服務器運行這個服務器,你需要安裝它,所以它只是安裝的一部分:確保安裝程序檢查mysql並搜索/詢問mysqldump命令的位置? – Nanne

回答

1

這個問題有純粹的Java解決方案;例如

(我沒有檢查以下任一看他們做一份體面的工作......因人而異。)

不過,我會謹慎使用第三方轉儲程序,因爲您可能最終得到的轉儲無法正常恢復。

是的,你需要知道mysqldump程序的路徑。但是這可以通過使用合理的默認值和/或配置文件中的條目來處理。你的「破壞性的可移植性」評論正在使小山變得一團糟。


我看不出任何明顯錯誤的代碼。我建議你從mysqldump中捕獲「標準錯誤」和「標準輸出」,看看它說了什麼。

  • 也許這是不正確的憑據或不存在的輸出目錄。
  • 也許你有一個選項不正確。 (這真的是你應該如何使用-B選項??)
+0

讓我檢查一下。並說「你的」破壞可移植性「的評論正在使我們的山很小。」我很喜歡它。 – MoienGK

+0

回合首先推薦:該項目目前沒有下載。 – MoienGK

1

首先,需要知道mysqldump可執行文件的位置並不一定意味着可移植性的喪失 - 只需將其作爲配置參數 - 作爲程序的命令行選項或配置文件。

其次,您運行mysqldump命令的問題很可能與您使用Runtime.exec()有關。 ProcessBuilder對象爲您提供更多的控制。在這裏有許多關於如何正確使用ProcessBuilder的問題和答案,您可能會發現其中的一些有用。

據我所知,沒有實際運行mysqldump可執行文件來執行mysqldump的全部java方法。