Java 异常后解锁HSQLdb

Java 异常后解锁HSQLdb,java,hsqldb,Java,Hsqldb,我正在尝试创建一个简单的自包含java应用程序,其中内置了Hsqldb数据库。我遇到了一个问题,在异常发生后,连接(?)仍然存在,锁文件存在并由java运行时使用,因此不能手动删除 我的问题是如何以编程方式检测数据库是否已锁定并解锁,而不杀死虚拟机并从头开始运行它?我认为如果项目比目前更先进,这种方法也可能损坏数据 必须有一种智能的方法来解决这种情况,而不是在每个未捕获的异常之后重命名数据库 main: public static void main(String[] args) throws

我正在尝试创建一个简单的自包含java应用程序,其中内置了Hsqldb数据库。我遇到了一个问题,在异常发生后,连接(?)仍然存在,锁文件存在并由java运行时使用,因此不能手动删除

我的问题是如何以编程方式检测数据库是否已锁定并解锁,而不杀死虚拟机并从头开始运行它?我认为如果项目比目前更先进,这种方法也可能损坏数据

必须有一种智能的方法来解决这种情况,而不是在每个未捕获的异常之后重命名数据库

main:

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;}
}

数据库由服务器类打开,该类在单独的线程中启动。您可以以SQL的形式执行SHUTDOWN命令,也可以使用server.SHUTDOWN()将其关闭并释放.lock文件

注意,您正在直接连接到数据库文件并启动服务器。有些程序是这样编写的,以允许外部访问。仅当您以SQL方式执行关闭时,数据库才会关闭


只要JVM处于活动状态且数据库未关闭,服务器就处于联机状态。

由于主程序崩溃/出现未处理的异常,服务器id丢失-但这意味着如果我只重新启动客户端,数据库仍可使用和操作?所以,如果我做一个例程来检查数据库是否正在运行,我就可以重新启动我的程序而不会出现任何问题?