【问题标题】:Unlock HSQLdb after exception异常后解锁 HSQLdb
【发布时间】: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;}
}

【问题讨论】:

    标签: java hsqldb


    【解决方案1】:

    数据库由 Server 类打开,该类在单独的线程中启动。您可以将 SHUTDOWN 命令作为 SQL 执行,或者使用 server.shutdown() 将其关闭并释放 .lock 文件。

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

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

    【讨论】:

    • 由于主程序崩溃/出现未处理的异常,服务器ID丢失了——但这意味着如果我只是重新启动客户端部分,数据库仍然可以使用和操作吗?所以如果我做一个例程来检查数据库是否正在运行,我可以重新启动我的程序而没有任何问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2013-02-15
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多