多个Java应用程序访问一个HSQLDB会导致应用程序挂起

多个Java应用程序访问一个HSQLDB会导致应用程序挂起,java,hsqldb,Java,Hsqldb,这与我以前的经历有一半的关系。如前一个问题所述,我有一个桌面应用程序,它调用一个不同的主方法来启动一个特定的进程。桌面应用程序和单独的Main方法都将访问相同的HSQLDB数据库 在此之前,我的桌面应用程序刚刚使用如下连接URL访问HSQLDB数据库: jdbc:hsqldb:file:/some/path/myDatabase 现在,这在单用户环境中运行良好。现在我已经有了一个多用户环境,桌面应用程序和单独的主进程想要读/写这个数据库,我想让这个数据库成为一个共享资源 我已经看了一眼这篇文章

这与我以前的经历有一半的关系。如前一个问题所述,我有一个桌面应用程序,它调用一个不同的主方法来启动一个特定的进程。桌面应用程序和单独的Main方法都将访问相同的HSQLDB数据库

在此之前,我的桌面应用程序刚刚使用如下连接URL访问HSQLDB数据库:

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

这正是我一直在尝试的。我正在尝试在一个单独的jvm中启动数据库,但它似乎还没有工作……我已经更新了答案,以包括示例,看看这是否有帮助。启动时显示的消息如我的原始帖子所示。它似乎没有像你这样的别名。如何显示别名位?我使用的是HSQLDB1.8.1.3。使用最简单的命令“java-cp lib\hsqldb.jar org.hsqldb.server”启动服务器,并使用getConnection(“jdbc:hsqldb:hsql://localhost/","sa","sa",;