Java 异常后解锁HSQLdb
我正在尝试创建一个简单的自包含java应用程序,其中内置了Hsqldb数据库。我遇到了一个问题,在异常发生后,连接(?)仍然存在,锁文件存在并由java运行时使用,因此不能手动删除 我的问题是如何以编程方式检测数据库是否已锁定并解锁,而不杀死虚拟机并从头开始运行它?我认为如果项目比目前更先进,这种方法也可能损坏数据 必须有一种智能的方法来解决这种情况,而不是在每个未捕获的异常之后重命名数据库 main:Java 异常后解锁HSQLdb,java,hsqldb,Java,Hsqldb,我正在尝试创建一个简单的自包含java应用程序,其中内置了Hsqldb数据库。我遇到了一个问题,在异常发生后,连接(?)仍然存在,锁文件存在并由java运行时使用,因此不能手动删除 我的问题是如何以编程方式检测数据库是否已锁定并解锁,而不杀死虚拟机并从头开始运行它?我认为如果项目比目前更先进,这种方法也可能损坏数据 必须有一种智能的方法来解决这种情况,而不是在每个未捕获的异常之后重命名数据库 main: public static void main(String[] args) throws
public static void main(String[] args) throws SQLException, ClassNotFoundException {
// System.out.println("Starting server - press enter");
Scanner s = new Scanner(System.in);
// s.nextLine();
DBserver serv = new DBserver(name, port);
serv.start();
System.out.println("started - hit enter to insert data");
s.nextLine();
Connection con = null;
try{
Class.forName("org.hsqldb.jdbcDriver"); //loads db driver
waitt("connect...");
con = DriverManager.getConnection(
"jdbc:hsqldb:" + name, "sa", "");
waitt("drop...");
try{
con.prepareStatement("drop table testtable;").execute();
}catch (Exception e){
System.err.println("Failed to drop... exception");
}
waitt("create table...");
con.prepareStatement("create table testtable (id INTEGER, " +
"name VARCHAR);").execute();
waitt("query table...");
ResultSet rs = con.prepareStatement("select * from testtable;").executeQuery();
rs.next();
System.out.println("ID = " + rs.getInt(1) + " Name=" + rs.getString(2));
} finally {
if (con != null) con.close();
}
waitt("finish...");
serv.stop();
serv.close();
System.out.println("Finished - bye");
}
DBserver.java
public class DBserver {
private String name = "noname";
private int port = 14643;
private Server serv = null;
public DBserver(){
serv = this.create();
}
public DBserver(String name, int port){
this.name = name;
this.port = port;
serv = this.create();
}
public Server create(){
Server server=new Server();
server.setDatabaseName(0,this.name);
server.setDatabasePath(0,"file:" + this.name);
server.setPort(this.port);
server.setSilent(true);
server.setLogWriter(null);
return server;
}
public int start(){
if (this.serv != null) return this.serv.start();
else return -1;
}
public int stop(){
if (this.serv != null) return this.serv.stop();
else return -1;
}
public int close(){
if (this.serv != null) {
this.serv.shutdown();
return 1;
}
else return -1;
}
public String getName(){ return this.name;}
public int getPort(){return this.port;}
}
数据库由服务器类打开,该类在单独的线程中启动。您可以以SQL的形式执行SHUTDOWN命令,也可以使用server.SHUTDOWN()将其关闭并释放.lock文件 注意,您正在直接连接到数据库文件并启动服务器。有些程序是这样编写的,以允许外部访问。仅当您以SQL方式执行关闭时,数据库才会关闭
只要JVM处于活动状态且数据库未关闭,服务器就处于联机状态。由于主程序崩溃/出现未处理的异常,服务器id丢失-但这意味着如果我只重新启动客户端,数据库仍可使用和操作?所以,如果我做一个例程来检查数据库是否正在运行,我就可以重新启动我的程序而不会出现任何问题?