以编程方式启动 hsqldb 数据库

Posted

技术标签:

【中文标题】以编程方式启动 hsqldb 数据库【英文标题】:Starting hsqldb database programmatically 【发布时间】:2012-04-25 21:05:57 【问题描述】:

我想以编程方式启动 HSQLdb 服务器。 我创建了一个如下所示的可运行对象,然后在线程中启动它。

   Runnable hsqlRunnable = new Runnable() 
                public void run()
                

                    HsqlProperties props = new HsqlProperties();
                    props.setProperty("server.database.0", "file:C:\Documents and Settings\BThirup\Application Data\Rockwell Automation\FactoryTalk ProductionCentre\logs\ApplicationLog\mydb;shutdown=true;");
                    props.setProperty("server.dbname.0", "xdb");
org.hsqldb.Server server = new org.hsqldb.Server();

                    try 
                        server.setProperties(props);
                     catch (Exception e) 
                        return;
                    

                    server.start();


我得到错误: [Thread[HSQLDB Server @4db602,6,main]]:因为没有打开的数据库而关闭

谁能帮忙指出我哪里出错了。

感谢您的帮助 巴拉

【问题讨论】:

想通了。现在工作。对于那些感兴趣的人 server.setTrace(true);提供故障排除所需的信息。 【参考方案1】:

您可以使用单独的类来管理您的 HSQLdb 服务器实例:

public class DBManager 

    final String dbLocation = "c:\\temp\\"; // change it to your db location
    org.hsqldb.server.Server sonicServer;
    Connection dbConn = null;

    public void startDBServer() 
        HsqlProperties props = new HsqlProperties();
        props.setProperty("server.database.0", "file:" + dbLocation + "mydb;");
        props.setProperty("server.dbname.0", "xdb");
        sonicServer = new org.hsqldb.Server();
        try 
            sonicServer.setProperties(props);
         catch (Exception e) 
            return;
        
        sonicServer.start();
    

    public void stopDBServer() 
        sonicServer.shutdown();
    

    public Connection getDBConn() 
        try 
            Class.forName("org.hsqldb.jdbcDriver");
            dbConn = DriverManager.getConnection(
                    "jdbc:hsqldb:hsql://localhost/xdb", "SA", "");
         catch (Exception e) 
            e.printStackTrace();
        
        return dbConn;
    

并使用这个类:

public class WFProcess extends Thread 

    DBManager dbm = new DBManager();

    public static void main(String[] args) 
        (new WFProcess()).start();
    

    public void run() 
        dbm.startDBServer();

        // some usefull server work here
        Connection conn = dbm.getDBConn();
        try 
            Statement stmt = conn.createStatement();
            stmt.executeQuery("CREATE TABLE IF NOT EXISTS answers (num INT IDENTITY, answer VARCHAR(250))");
            stmt.executeQuery("INSERT INTO answers (answer) values ('this is a new answer')");
            ResultSet rs = stmt.executeQuery("SELECT num, answer FROM answers");
            while (rs.next()) 
                System.out.println("Answer number: " + rs.getString("num")
                        + "; answer text: " + rs.getString("answer"));
            
         catch (Exception e) 
            e.printStackTrace();
        
        // end of usefull server work

        dbm.stopDBServer();
    

【讨论】:

【参考方案2】:

正如您所说, server.setTrace(true) 有助于排除故障。 server.setSilent(false) 也是如此。

但是您不应该创建并启动 Runnable 来启动服务器。 Server 类完成所有这些工作并启动必要的线程。

【讨论】:

是的,弗雷德。如果我通过 main 调用服务器,它会创建和管理线程。但是我的要求是在所有客户端断开连接时关闭服务器。因此,我选择通过线程启动 hsqldb 服务器,这样当父进程关闭时,hsqldb 服务器也将关闭。不幸的是,使用 shutdown=true 启动服务器不起作用。这足以满足我的目的。【参考方案3】:

对于 HSQL 2.3.x,请参阅下文以将 HSQL 作为 WebServer 运行(使用端口 80 进行网络的 HSQL 服务器。)

https://***.com/a/37784679/15789

【讨论】:

以上是关于以编程方式启动 hsqldb 数据库的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式合并 HSQLDB 数据库

在应用程序启动时启动 HSQLDB 数据库管理器?

如何找出给定 JBoss 实例的 HSQLDB 版本

将数据库连接到 HSQLDB 服务器

如何更改 HSQLDB 服务器侦听的端口

如何删除 hsqldb 中的默认数据库/模式