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

时间:2010-09-07 16:17:26

标签: java hsqldb

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

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

3 个答案:

答案 0 :(得分: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);
        }
    }
    
  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> 
    
  3. 执行此操作后,Web应用程序将在新线程中启动HSQLDB。对于在应用程序停止时关闭数据库,您可以覆盖InitServlet的方法destroy()。在方法destroy中,你必须执行命令“SHUTDOWN”作为正常的sql查询(通过JDBC)。

答案 1 :(得分:1)

您可以在嵌入模式下的任何Web / app服务器上使用HSQLDB,并允许外部应用程序通过在您的Web / app服务器上运行org.hsqldb.server.Servlet来访问它。然后外部应用程序将使用jdbc:hsqldb:http:type url连接到servlet。

如果要运行org.hsqldb.server.Server(版本2.0类)或org.hsqldb.Server,作为Tomcat的单独进程,可以使用类org.hsqldb.util.MainInvoker来调用多个类的主要方法(例如Tomcat和HSQLDB Server),首先调用Server。

答案 2 :(得分:0)

这个问题已经过时了,但是我最近遇到了类似的情况。我试图访问在TomEE服务器中运行的嵌入式HSQLDB数据库。 @fredt的回答给了我决定性的提示,但我仍在努力寻找所有细节。 这是我的解决方案:

org.hsqldb.server.Servlet 的servlet映射添加到 web.xml web-fragment.xml 描述符文件中:

<servlet>
    <servlet-name>hsqldb</servlet-name>
    <servlet-class>org.hsqldb.server.Servlet</servlet-class>
    <init-param>
        <param-name>hsqldb.server.database</param-name>
        <param-value>${catalina.base}/hsqldb/db</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>hsqldb</servlet-name>
    <url-pattern>/hsqldb</url-pattern>
</servlet-mapping>

使用参数 hsqldb.server.database ,您可以指定数据库的位置。因为Tomcat / Tomcat区分 CATALINA_HOME CATALINA_BASE ,所以仅指定诸如“ hsqldb / db”之类的相对路径是不够的。 但是您可以使用Tomcat / TomEE提供的系统属性,例如 $ {catalina.base} 来使路径绝对。

启动服务器后,可以通过URL访问HSQLDB数据库

jdbc:hsqldb:http://localhost:8080/<context-path>/hsqldb