我想通过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吗?
答案 0 :(得分:0)
该过程仍然存在的原因是您永远不会终止它。如果以上述方式使用Java Process API,则子进程(MySQL)会等待指令执行操作。这是有道理的,因为大多数时候,Java代码将希望与子进行通信并通过stdio交换数据。
在您的情况下,这没有意义:您已经通过JDBC进行通信,因此stdio管道只是闲着,让孩子保持活力。当Java停止时,大多数孩子都死了,但显然MySQL更具弹性。
在这种情况下调用destroy是安全的,因为即使主进程意外崩溃,MySQL也不能破坏数据。不过,这不是一个好习惯。
解决您的问题:
Process.waitFor()
以确保正确清理子流程。