如何从我的Web应用程序中启动并继续在服务器模式下运行hsqldb?

Rav*_*dev 10 java hsqldb

我不想在嵌入模式下使用它,因为我也可以允许其他外部应用程序访问它.我想在Tomcat加载我的应用程序的同时执行服务器的启动(或者只是当tomcat运行时).这样我就不必要求客户端使用命令或脚本手动运行hsqldb,然后才能将我的战争放入tomcat并运行它(为了简单起见).

我可以通过从Java发送命令从main 调用Server,但这会给我一个无休止的线程,我不知道如何处理它.有没有更容易测试的方法来做到这一点?

Ern*_*oso 9

根据HSQLDB文档,可以从Java代码启动数据库:http: //hsqldb.org/doc/2.0/guide/listeners-chapt.html#listeners_appstart-sect.因此,您可以在Web应用程序启动时使用servlet加载数据库.步骤应如下:

  1. 创建一个Servlet"InitDatabase"并在方法init()上放置启动数据库的代码

    @Override
    public void init() throws ServletException {
        super.init();
        try {
            System.out.println("Starting Database");
            HsqlProperties p = new HsqlProperties();
            p.setProperty("server.database.0", "file:/opt/db/crm");
            p.setProperty("server.dbname.0", "mydb");
            p.setProperty("server.port", "9001");
            Server server = new Server();
            server.setProperties(p);
            server.setLogWriter(null); // can use custom writer
            server.setErrWriter(null); // can use custom writer
            server.start();
        } catch (AclFormatException afex) {
            throw new ServletException(afex);
        } catch (IOException ioex) {
            throw new ServletException(ioex);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在web.xml中,在启动时添加属性加载并将其设置为1.这用于在Web应用程序启动时调用方法init().

    <servlet>
        <servlet-name>InitDatabase</servlet-name>
        <servlet-class>bo.hsqltest.InitDatabase</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet> 
    
    Run Code Online (Sandbox Code Playgroud)

执行此操作后,Web应用程序将在新线程中启动HSQLDB.对于在应用程序停止时关闭数据库,您可以覆盖InitServlet的方法destroy().在方法destroy中,你必须执行命令"SHUTDOWN"作为正常的sql查询(通过JDBC).