这与我之前的问题半关联.正如上一个问题所述,我有一个桌面应用程序,它会调用另一个将启动特定进程的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)
在这种情况下,没有别名.我只是测试了它,它工作正常.
| 归档时间: |
|
| 查看次数: |
8276 次 |
| 最近记录: |