我有一个可执行jar,它运行带有内部SqlLite数据库的Java Swing应用程序。 用户(错误地)不仅仅是点击jar,导致db锁定。 我想防止这种行为。 我能做什么? 非常感谢你
答案 0 :(得分:1)
您需要某种同步机制。
您需要自己编写代码,或者您可以为您的应用程序创建Java WebStart配置,其中Java WebStart可以通过单实例服务(您必须在代码中明确调用)处理“仅一次调用”。
答案 1 :(得分:0)
访问db的第一个实例应该在db上获取某种锁,并且所有其他实例应该首先检查是否已存在这样的锁。如果有一个 - > “我不是第一个,显示警告/错误,退出。”,如果没有“我是第一个,请锁定,继续。”
答案 2 :(得分:0)
您可以使用JPS或JNI(需要在不同平台上实施)。附件是用于检查Java应用程序实例的JPS代码。您可以将其修改为更多OO。
使用文件,套接字或注册表作为锁定并不完美,因为错误操作很可能会导致您的应用程序无法再启动(例如,另一个程序占用相同的端口)
import java.io.*;
public class TestRun {
public TestRun() {}
public static void main(String args[]) {
String jpsApp = "jps -mlvV";
int count = 0;
try {
Process p = Runtime.getRuntime().exec(jpsApp);
//parser the result to check if TestAPP is running
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println();
System.out.println(line);
String[] pair = line.split(" ");
if (pair.length >= 2) {
System.out.println("name is " + pair[1]);
if (pair[1].trim().indexOf("TestRun") > -1) {
count++;
System.out.println("count is " + count);
}
}
}
//it is running, just exit the second instance
if(count>1){
System.out.println("Has run a application!");
return;
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}