通过java启动和停止mysql

时间:2014-02-27 08:06:58

标签: java mysql-connector mysql

我想通过java程序启动和停止mysql。我尝试了this问题的解决方案,但它无法启动mysql。然后我尝试使用如下的其他命令:

private static String commandStart = SQL_INSTALL_DIR + "/bin/mysqld";
private static String commandStop = SQL_INSTALL_DIR + "/bin/mysqld -u root shutdown";

public static void main(String[] args) {

    Connection con = null;
    Statement st = null;
    ResultSet rs = null;

    startMysql();

    String url = "jdbc:mysql://localhost:3306/testdb";
    String user = "testuser";
    String password = "test623";

    try {
        con = DriverManager.getConnection(url, user, password);
        st = con.createStatement();
        rs = st.executeQuery("SELECT VERSION()");

        if (rs.next()) {
            System.out.println(rs.getString(1));
        }

    } catch (SQLException ex) {
        Logger lgr = Logger.getLogger(Main.class.getName());
        lgr.log(Level.SEVERE, ex.getMessage(), ex);

    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        try {
            if (rs != null) {
                rs.close();
            }
            if (st != null) {
                st.close();
            }
            if (con != null) {
                con.close();
            }
            stopMysql();
        } catch (SQLException ex) {
            Logger lgr = Logger.getLogger(Main.class.getName());
            lgr.log(Level.WARNING, ex.getMessage(), ex);
        }
    }
}

private static void startMysql() {
    try {
        mysqlProc = Runtime.getRuntime().exec(commandStart);
        System.out.println("MySQL server started successfully!");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private static void stopMysql() {
    try {
        Runtime.getRuntime().exec(commandStop);
        System.out.println("MySQL server stopped successfully!");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

该程序的输出如下:

MySQL server started successfully!
5.6.16
MySQL server stopped successfully!

但是,进程(java代码执行)最终没有终止,它仍然是Running

这次它能够启动该过程但无法阻止它。在上面的代码中可以使用mysqlProc.destroy()来解扰该过程,但这不是一个不好的做法吗?

那么,如何停止使用上述命令启动的mysql servere?

或者,还有其他方法可以通过java启动和停止mysql吗?

1 个答案:

答案 0 :(得分:0)

该过程仍然存在的原因是您永远不会终止它。如果以上述方式使用Java Process API,则子进程(MySQL)会等待指令执行操作。这是有道理的,因为大多数时候,Java代码将希望与子进行通信并通过stdio交换数据。

在您的情况下,这没有意义:您已经通过JDBC进行通信,因此stdio管道只是闲着,让孩子保持活力。当Java停止时,大多数孩子都死了,但显然MySQL更具弹性。

在这种情况下调用destroy是安全的,因为即使主进程意外崩溃,MySQL也不能破坏数据。不过,这不是一个好习惯。

解决您的问题:

  1. 使用启动MySQL作为守护程序的shell脚本包装器。脚本应该立即启动并返回,让MySQL服务器在后台运行。
  2. 确保正确处理stdio。如果您将这些管道留在周围,孩子可能会挂起(例如,出现错误时)。
  3. 您最终必须致电Process.waitFor()以确保正确清理子流程。