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

dig*_*nie 8 java hsqldb

这与我之前的问题半关联.正如上一个问题所述,我有一个桌面应用程序,它会调用另一个将启动特定进程的Main方法.桌面应用程序和单独的Main方法都将访问相同的HSQLDB数据库.

在实现这一目标之前,我的桌面应用程序刚刚使用类似这样的连接URL访问HSQLDB数据库:

jdbc:hsqldb:file:/some/path/myDatabase
Run Code Online (Sandbox Code Playgroud)

现在,这在单个用户环境中工作正常.既然我已经拥有一个桌面应用程序的多用户环境以及想要读/写此数据库的单独主进程,我想让这个数据库成为共享资源.

我已经看过HSQLDB文档以及关于创建共享HSQLDB数据库的这篇文章,但无济于事.

在帖子中,它讨论了通过代码启动服务器.我不认为这是我想要做的事情,因为我希望HSQLDB数据库一直在运行,因为桌面应用程序可能有多个用户.

查看官方的HSQLDB文档,它声明您可以像这样启动HSQLDB服务器:

java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 file:mydb -dbname.0 xdb
Run Code Online (Sandbox Code Playgroud)

如果我用我自己的数据库文件和名称运行上面的命令,它似乎启动好了:

[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.
Run Code Online (Sandbox Code Playgroud)

然后我将连接URL更改为以下内容:

jdbc:hsqldb:hsql://localhost/xdb
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎不起作用.关于我做错了什么或者我可能错过什么的任何想法?

此外,当桌面应用程序调用外部Main方法时,桌面应用程序只会挂起,因为外部Main方法会注意到桌面应用程序似乎锁定了数据库.一旦我关闭桌面应用程序,外部Main方法实际上就会按照我的预期执行.

kda*_*bir 10

使用jdbc:hsqldb:file:/some/path/myDatabase你正在创建一个进程内数据库,所以这不应该在多个JVM之间共享(理想情况下),但是根据指南有一种方法

"在1.8.0中,您可以在与应用程序相同的虚拟机的线程中运行服务器实例,并提供对进程内数据库的外部访问."

imho,更好的方法是在单独的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.
Run Code Online (Sandbox Code Playgroud)

匹配驱动程序URL中的别名

Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/", "sa", "");
Run Code Online (Sandbox Code Playgroud)

在这种情况下,没有别名.我只是测试了它,它工作正常.