Я пытаюсь создать простое автономное Java-приложение с встроенной в него базой данных Hsqldb. Я столкнулся с проблемой, когда после возникновения исключения соединение (?) Остается, файл блокировки присутствует и используется java runtime и как таковой - не может быть удален вручную.Unlock HSQLdb после исключения
Мой вопрос: Как я могу программно обнаружить, что база данных заблокирована и разблокировать ее, не убивая виртуальную машину и не запуская ее с нуля? Я предполагаю, что этот подход может также повредить данные, если проект был более продвинутым, чем в настоящее время ...
Должен быть разумный способ разрешить эту ситуацию вместо переименования базы данных после каждого исключения, которое не было обнаружено.
главная:
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;}
}
Поскольку основная программа разбилась/получила необработанное исключение, идентификатор сервера потерян - но это значит, что базу данных все еще можно использовать и использовать, если я просто перезапущу часть клиента? Поэтому, если я создаю процедуру проверки работоспособности базы данных, я могу просто перезапустить программу без каких-либо проблем? – user3002166
Обновлен ответ. – fredt