【问题标题】:Back-up in JAVA takes too much time to executeJAVA中的备份需要太多时间来执行
【发布时间】: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


【解决方案1】:

如果您在事件侦听器中运行此代码,它将冻结 GUI,直到备份完成。您需要在单独的线程中运行它。

【讨论】:

    【解决方案2】:

    我不确定是否可以在 mysql 中单独备份所有表,但如果可以创建一个多线程应用程序,该应用程序将从所有表中获取备份,并且它们将为每个表单独创建备份文件可能你可以从你的代码中合并的表。在每个线程中使用count down latch。线程处理完成后,您可以合并文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      • 2021-12-25
      • 2020-08-28
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多