我有 n 个连接到 MYSQL 的 Netbeans Java 项目,用于从我的数据库读取数据。
但是MYSQL服务没有运行,我必须手动启动它。 我可以在我的代码中启动此服务吗? Windows Services
最佳答案
此解决方案特定于 Windows,并假设 MySQL 服务名称为 MySQL80(如屏幕截图所示)。如果 MySQL 服务不是从 Windows 中的 Java 运行,则启动它:
- 创建一个 BAT 文件,仅包含 NET START MySQL80
创建该 BAT 文件的快捷方式。在 Windows 文件资源管理器中显示该快捷方式的属性,单击快捷方式选项卡,单击高级...按钮,然后选中以管理员身份运行> 框:
运行如下所示的 Java 应用程序,它将:
- 通过解析命令 sc query MySQL80 返回的输出来检查 MySQL80 服务的状态。请参阅下面代码中的方法
getServiceState()
。 - 如果服务未运行(因为
getServiceState()
返回“已停止”),请运行 BAT 文件的快捷方式(以管理员身份)来启动服务。请参阅下面代码中的方法startService()
,并根据需要设置String shortcut
的值。 - 如果服务已在运行(
getServiceState()
返回“RUNNING”),或者服务名称无法识别,则代码不执行任何操作。 - 如果启动服务时出现问题,则会显示错误流。
- 通过解析命令 sc query MySQL80 返回的输出来检查 MySQL80 服务的状态。请参阅下面代码中的方法
这是代码:
package servicestarter;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ServiceStarter {
public static void main(String[] args) {
try {
ServiceStarter ss = new ServiceStarter();
String serviceName = "MySQL80";
String serviceStatus = ss.getServiceState(serviceName);
if ("STOPPED".equals(serviceStatus)) {
System.out.println("Service " + serviceName + " is stopped. Starting the service...");
String shortcut = "D:\\temp\\netstartmysql80.bat.lnk";
Process process = ss.startService(shortcut);
// Display any error output. Should be nothing there if all goes well...
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
private String getServiceState(String serviceName) throws IOException {
String state = "";
Process process = Runtime.getRuntime().exec("cmd.exe /c sc query " + serviceName);
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
if (line.contains("STATE")) {
String[] tokens = line.split("\\s+");
state = tokens[tokens.length - 1];
break;
}
}
reader.close();
return state; // Returns "STOPPED" or "RUNNING", or empty string for invalid service name.
}
private Process startService(String shortcut) throws IOException {
return Runtime.getRuntime().exec("cmd.exe /c " + shortcut);
}
}
方法getServiceState()
只是解析sc查询MySQL80产生的内容来确定服务的状态(“STATE”):
C:\WINDOWS\system32>sc query MySQL80
SERVICE_NAME: MySQL80
TYPE : 10 WIN32_OWN_PROCESS
STATE : 1 STOPPED
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
注释:
- 上面的代码适用于我在 Windows 10 上启动名为“MySQL80”的 MySQL 8.0 服务,尽管它应该通过更改
String serviceName
的值来启动任何 STOPPED 服务,以及运行的快捷方式的名称和内容。 - 此方法有一个可能会破坏交易的问题:因为该服务必须以管理员身份启动,当 BAT 文件运行,询问“您想要允许此应用程序对您的设备进行更改吗?”。您可以通过从以管理员身份运行的命令提示符窗口运行应用程序来轻松避免出现该提示,但这对您来说不一定是可行的方法。
- 这不是一个可靠的解决方案。如果 SC QUERY {service name} 生成的输出发生更改,此代码可能会损坏,但我不知道有 Java API 可以直接查询 Windows 服务。
关于java - netbeans java 检查本地服务是否正在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52588402/