我正在尝试使用内置的Hsqldb数据库创建一个简单的自包含Java应用程序。我遇到了一个问题,在发生异常后连接(?)仍然存在,锁定文件存在并由java运行时使用,因此无法手动删除。
我的问题如何以编程方式检测数据库是否被锁定并解锁它而不会破坏虚拟机并从头开始运行?我认为如果项目比目前更先进,那么这种方法也会损坏数据......
必须有一种智能方法来解决这种情况,而不是在每次未捕获的异常后重命名数据库。
主要
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;}
}
答案 0 :(得分:0)
数据库由Server类打开,该类在单独的线程中启动。您可以以SQL身份执行SHUTDOWN命令,或者使用server.shutdown()将其关闭并释放.lock文件。
请注意,您将直接连接到数据库文件以及启动服务器。有些程序是这样编写的,以允许外部访问。只有在以SQL执行SHUTDOWN时才会关闭数据库。
只要JVM处于活动状态且数据库尚未关闭,服务器就处于联机状态。