【发布时间】:2015-04-13 03:38:32
【问题描述】:
我正在尝试使用内置的 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;}
}
【问题讨论】: