2015-02-12 3 views
0

Я пытаюсь создать простое автономное 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;} 
} 

ответ

0

база данных открыта классом сервера, который запускается в отдельном потоке. Вы можете выполнить команду SHUTDOWN как SQL или использовать server.shutdown(), чтобы закрыть ее и отпустить файл .lock.

Обратите внимание, что вы напрямую подключаетесь к файлам базы данных, а также запускаете сервер. Некоторые программы написаны так, чтобы разрешить внешний доступ. База данных отключается, только если вы выполняете SHUTDOWN как SQL.

Сервер находится в сети, пока JVM активна, а база данных не была SHUTDOWN.

+0

Поскольку основная программа разбилась/получила необработанное исключение, идентификатор сервера потерян - но это значит, что базу данных все еще можно использовать и использовать, если я просто перезапущу часть клиента? Поэтому, если я создаю процедуру проверки работоспособности базы данных, я могу просто перезапустить программу без каких-либо проблем? – user3002166

+0

Обновлен ответ. – fredt