我不想在嵌入模式下使用它,因为我也可以允许其他外部应用程序访问它。我想在Tomcat加载我的应用程序的同时执行服务器的启动(或者只是当tomcat运行时)。这样我就不必要求客户端使用命令或脚本手动运行hsqldb,然后才能将我的战争放入tomcat并运行它(为了简单起见)。
我可以通过从Java发送命令从main调用Server,但这会给我一个无休止的线程,我不知道如何处理它。有没有一种更容易测试的方法来做到这一点?
答案 0 :(得分:9)
根据HSQLDB文档可以从Java代码启动数据库: http://hsqldb.org/doc/2.0/guide/listeners-chapt.html#listeners_appstart-sect。因此,您可以在Web应用程序启动时使用servlet加载数据库。步骤应如下:
创建一个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);
}
}
在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>
执行此操作后,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