簡體   English   中英

異常后解鎖HSQLdb

[英]Unlock HSQLdb after exception

我正在嘗試使用內置的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;}
}

該數據庫由在單獨線程中啟動的Server類打開。 您可以將SHUTDOWN命令作為SQL執行,也可以使用server.shutdown()將其關閉並釋放.lock文件。

請注意,您將直接連接到數據庫文件以及啟動服務器。 一些這樣編寫的程序允許外部訪問。 僅當您將SHUTDOWN作為SQL執行時,數據庫才會關閉。

只要JVM處於活動狀態且數據庫尚未關閉,服務器就處於聯機狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM