2013-09-30 48 views
0

我想用java的mysqldump來爲我的數據庫創建一個轉儲。運行時 - 執行到使用mysqldump轉儲數據庫JAVA

我已經完成了代碼,但條件if(processCompleted == 0)永遠不會出於某種原因,我不明白。我這樣說是因爲在控制檯上沒有例外,但它總是打印

「執行轉儲時出錯!

這導致我得出結論,如果(processCompleted == 0)永遠不會見面。

有人可以請解釋我在做什麼錯在這裏?

public boolean backupDatabase(String path, String whichServer) 
{ 
    String cmd; 
    Process runtimeProcess; 

    if(whichServer.equalsIgnoreCase("local")) 
    { 
     cmd = "mysqldump -u " + getSourceUsername() + " -p" + getSourceServerPassword() 
      + " --add-drop-database -B " + getSourceDatabase() + " -r " + path; 
    }   
    else if(whichServer.equalsIgnoreCase("remote")) 
    { 
     cmd = "mysqldump -u " + getDestinationUsername() + " -p" + getDestinationServerPassword() 
      + " --add-drop-database -B " + getDestinationDatabase() + " -r " + path; 
    } 
    else 
    { 
     System.out.println("Input server incorrect"); 
     return false; 
    } 

    try{ 

     String[] cmdArray = new String[]{"C:\\wamp\\bin\\mysql\\mysql5.5.24\\bin\\mysqldump.exe", cmd}; 
     System.out.println("Preparing for dump."); 
     runtimeProcess = Runtime.getRuntime().exec(cmdArray); 

     int processCompleted = runtimeProcess.waitFor(); 

     if(processCompleted == 0) 
     { 
      System.out.println("Dump done!"); 
      return true; 
     } 
     else 
     { 
      System.out.println("Error doing dump!"); 
     } 

    } catch(Exception ex) 
    { 
     System.out.println("Exception -> " + ex.getMessage()); 
    } 
    return false; 

} 

下面是使用@MadProgrammer建議我的代碼:

public boolean backupDatabase(String path, String whichServer) 
{ 

    List<String> args = new ArrayList<String>(); 
    args.add("C:\\wamp\\bin\\mysql\\mysql5.5.24\\bin\\mysqldump.exe"); 

    args.add("-u"); 
    args.add(getSourceUsername()); 
    args.add("-p"); 
    args.add(getSourceServerPassword()); 
    args.add("--add-drop-database"); 
    args.add("-B"); 
    args.add(getSourceDatabase()); 
    args.add("-r"); 
    args.add(path); 

    try{ 
     ProcessBuilder pb = new ProcessBuilder(args); 
     pb.redirectError(); 
     Process p = pb.start(); 

     InputStream is = p.getInputStream(); 

     int in = -1; 

     while((in = is.read()) != -1) 
     { 
      System.out.println((char) in); 
     } 

     int proccessCompleted = p.waitFor(); 

     if(proccessCompleted == 0) 
     { 
      System.out.println("Dump done!"); 
      return true; 
     } 
     else 
     { 
      System.out.println("Error doing dump!"); 
      return false; 
     } 
    } 
    catch(IOException | InterruptedException ex) 
    { 
     System.out.println("Exception exportDB -> " + ex.getMessage() + "|" + ex.getLocalizedMessage()); 
    } 
    return false; 
} 

PS;你在哪裏寫的「//這是一個單一的命令?」 -p是密碼的命令,getSourceServerPassword()是獲取密碼的方法。

回答

2

我懷疑是因爲你已經將cmdArray分隔成兩個元素,mysqldump將第二個數組元素作爲單個命令行參數對待。

此外,您還沒有關注過程的輸出,這使得確定處理過程試圖說明的內容非常困難。

你「基地」命令還包括mysqldump ...

"mysqldump -u " + getSourceUsername() + " -p" + getSourceServerPassword() 
     + " --add-drop-database -B " + getSourceDatabase() + " -r " + path; 

的命令,這意味着你實際上調用mysqldump mysqldump的一部分......

而不是使用String,全部到位您的命令改爲某種列表。

記住,如果它是由一個空間在命令行中分離出來,它是一個單獨的命令/元素

List<String> args = new ArrayList<String> 
args.add("C:\\wamp\\bin\\mysql\\mysql5.5.24\\bin\\mysqldump.exe"); 
//... 
args.add("-u"); 
args.add(getSourceUsername()); 
args.add("-p" + getSourceServerPassword()); //?? Is this a single command? 
args.add("--add-drop-database"); 
args.add("-B"); 
args.add(getSourceDatabase()); 
args.add("-r"); 
args.add("path); 
//... 

然後使用ProcessBuilder

ProcessBuilder pb = new ProcessBuilder(args); 
pb.redirectError(); 
Process p = pb.start(); 

InputStream is = p.getInputStream(); 
int in = -1; 
while ((in = is.read()) != -1) { 
    System.out.print((char)in); 
} 

int processCompleted = p.waitFor(); 

記住,你永遠不應該從忽略輸出過程中,即使您不在意,也應該嘗試使用InputStream中的內容,因爲如果未讀取輸出流,某些進程將掛起。

+0

感謝您的幫助,但現在我得到了'java.lang.NullPointerException'作爲'Process p = pb.start();' 我可以用您編寫的代碼編輯最初的問題,如果您想要 – dazito

+0

是的,一個更新將是有用的... – MadProgrammer

+0

完成,請檢查它 – dazito