【发布时间】:2015-12-15 03:43:26
【问题描述】:
所以,我想为我的 mysql 数据库创建一个备份文件。
但是,当我尝试运行代码时,它花费了太多时间并且仍然没有响应。
这是我的代码:
public void backup() {
String fileName = "";
URL url;
JFileChooser backupFile = new JFileChooser();
backupFile.setCurrentDirectory(new java.io.File("."));
backupFile.setDialogTitle("Select the Path of Backup");
backupFile.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
backupFile.setAcceptAllFileFilterUsed(false);
backupFile.setApproveButtonText("Backup Database");
backupFile.setSize(700, 400);
backupFile.setLocation(100, 100);
if (backupFile.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
try {
url = backupFile.getSelectedFile().toURL();
fileName = url.toString().replaceAll("file:/", "").trim();
System.out.println(fileName);
} catch (MalformedURLException e) {
e.printStackTrace();
}
} else {
System.out.println("No Selection");
}
try {
String dbName = AppVars.dbName;
String dbUser = AppVars.dbUserName;
String dbPass = AppVars.dbPassword;
if (!fileName.equals("") && fileName != null) {
String savePath = fileName + "ssmis.sql";
String executeCmd = AppVars.xamppUrl + "mysqldump -u " + dbUser + " -p " + dbPass + " --database " + dbName + " -r " + savePath;
System.out.println(executeCmd);
Process runtimeProcess = Runtime.getRuntime().exec(executeCmd);
int processComplete = runtimeProcess.waitFor();
System.out.println("Here");
if (processComplete == 0) {
JOptionPane.showMessageDialog(null, "Backup Successful", "Success", JOptionPane.INFORMATION_MESSAGE);
} else {
JOptionPane.showMessageDialog(null, "Backup Failed", "Failed", JOptionPane.INFORMATION_MESSAGE);
}
}
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Error at Backup " + ex);
}
}
我做错了什么?
【问题讨论】:
-
MySQL 转储命令需要多长时间?可能这就是为什么需要这么长时间的原因。
-
过了一分钟左右,仍然没有执行命令。我的数据库没有密码,需要输入密码吗?
-
说真的,使用
ProcessBuilder,它更易于配置。在单独的Strings 中分解您的命令和参数,它解决了带有空格的参数的问题。阅读Process的输出和错误流,以确保您没有停止进程。使用SwingWorker执行进程,这样您就不会阻塞事件调度线程。更多详情请见this example -
如果您没有密码,则不应将任何密码传递给命令行。我认为,当您传递空字符串时,MySQL 可以将其视为空密码。尝试使用您在命令行中使用的相同参数在 Java 中运行 MySQL 转储。
-
在命令行上执行
executeCmd,查看需要多长时间。对于有一些超过 100'000 行的表来说,一分钟是没有时间的。
标签: java swing file-handling