多个Java应用程序访问一个HSQLDB会导致应用程序挂起
这与我以前的经历有一半的关系。如前一个问题所述,我有一个桌面应用程序,它调用一个不同的主方法来启动一个特定的进程。桌面应用程序和单独的Main方法都将访问相同的HSQLDB数据库 在此之前,我的桌面应用程序刚刚使用如下连接URL访问HSQLDB数据库:多个Java应用程序访问一个HSQLDB会导致应用程序挂起,java,hsqldb,Java,Hsqldb,这与我以前的经历有一半的关系。如前一个问题所述,我有一个桌面应用程序,它调用一个不同的主方法来启动一个特定的进程。桌面应用程序和单独的Main方法都将访问相同的HSQLDB数据库 在此之前,我的桌面应用程序刚刚使用如下连接URL访问HSQLDB数据库: jdbc:hsqldb:file:/some/path/myDatabase 现在,这在单用户环境中运行良好。现在我已经有了一个多用户环境,桌面应用程序和单独的主进程想要读/写这个数据库,我想让这个数据库成为一个共享资源 我已经看了一眼这篇文章
jdbc:hsqldb:file:/some/path/myDatabase
现在,这在单用户环境中运行良好。现在我已经有了一个多用户环境,桌面应用程序和单独的主进程想要读/写这个数据库,我想让这个数据库成为一个共享资源
我已经看了一眼这篇文章,但是没有用
在文章中,它谈到了通过代码启动服务器。我不认为这是我想做的,因为我想让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方法实际上完成了我期望它完成的任务。使用
jdbc:hsqldb:file:/some/path/myDatabase
您正在创建一个进程内数据库,因此这不应该在多个JVM之间共享(理想情况下),但是有一种方法符合指南
“在1.8.0中,您可以运行服务器
同一线程中的实例
虚拟机作为您的应用程序
并提供外部访问您的
进程内数据库。”
当然,更好的方法是在单独的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", "");
在本例中,没有别名。我刚刚测试了这个,效果很好。由@kunal给出的答案是正确的。但您有一个server.properties文件,其中可能包含以下设置:
server.database.0 file:mydb
server.dbname.0 xdb
使用server.properties文件进行设置,或者使用命令行。不要两者都用
启动服务器后,桌面应用程序将无法再使用jdbc:hsqldb:file:/some/path/myDatabase
URL连接到数据库。它需要连接到jdbc:hsqldb:hsql://localhost/xdb
URL
HSQLDB有一个通用的解决方案,用于为不同的进程调用main方法。使用该类调用任何进程我遇到了类似的问题,一个应用程序写入
hsqldb
,另一个应用程序从中读取
我没有使用服务器
就解决了所有问题,我使用的只是找到的一些配置
我添加了以下属性:
- 应用程序,其中写入:
readonly=false
hsqldb.lock_file=false
- 仅读取以下内容的应用程序:
readonly=true