这与我以前的question半相关。如前一个问题所述,我有一个桌面应用程序,该应用程序调用将启动特定进程的另一个Main方法。桌面应用程序和单独的Main方法都将访问相同的HSQLDB数据库。
在深入探讨之前,我的桌面应用程序刚刚使用如下所示的连接URL访问HSQLDB数据库:
jdbc:hsqldb:file:/some/path/myDatabase
现在,这在单个用户环境中可以正常工作。现在,我已经有了一个具有桌面应用程序的多用户环境,并且希望通过该数据库读取/写入该数据库的单独的Main进程,我希望将该数据库作为共享资源。
我看过HSQLDB documentation和有关Creating a shared HSQLDB database的帖子,但无济于事。
在帖子中,它讨论了通过代码启动服务器。我不希望这是我想要做的,因为我希望一直启动并运行HSQLDB数据库,因为桌面应用程序可能有多个用户。
查看官方的HSQLDB文档,它指出您可以像这样启动HSQLDB服务器:
java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 file:mydb -dbname.0 xdb
如果我使用自己的数据库文件和名称运行上述命令,则似乎可以正常启动:
[Server@6ca1c]: [Thread[main,5,main]]: checkRunning(false) entered
[Server@6ca1c]: [Thread[main,5,main]]: checkRunning(false) exited
[Server@6ca1c]: Startup sequence initiated from main() method
[Server@6ca1c]: Loaded properties from [/some/path/myDatabase/server.properties]
[Server@6ca1c]: Initiating startup sequence...
[Server@6ca1c]: Server socket opened successfully in 16 ms.
然后,我将连接URL更改为以下内容:
jdbc:hsqldb:hsql://localhost/xdb
这似乎对我不起作用。关于我做错了什么或我可能会错过的任何想法?
此外,当桌面应用程序调用外部Main方法时,桌面应用程序只是挂起,因为外部Main方法注意到桌面应用程序似乎已锁定数据库。一旦关闭桌面应用程序,外部Main方法实际上就会执行我期望的操作。
最佳答案
使用jdbc:hsqldb:file:/some/path/myDatabase
您正在创建一个进程内数据库,因此不应(最好)在多个JVM之间共享该数据库,但是按照指南提供了一种方法
恕我直言,更好的方法是在单独的jvm中以服务器模式启动。
更新:
在hsqlsdb服务器启动时检查您的日志:
[Server@83cc67]: Initiating startup sequence...
[Server@83cc67]: Server socket opened successfully in 31 ms.
[Server@83cc67]: Database [index=0, id=0, db=file:test, alias=] opened sucessfully in 250 ms.
与驱动程序URL中的别名匹配
Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/", "sa", "");
在这种情况下,没有别名。我刚刚测试了一下,效果很好。