我想做什么:我的应用程序与Derby DB完全连接,我想在DB(只读)中并行浏览(使用不同的工具)。
我不确定Derby在内部是如何工作的,但我知道我只能有一个与Derby DB的活动连接。 但是,由于数据库只包含我的硬盘上的文件,我是否应该能够以只读模式打开其他连接?
有没有工具可以做到这一点?
答案 0 :(得分:7)
如何运行Apache Derby DB有两种可能性。
您可以根据驱动程序大小识别类型。如果驱动程序超过2MB,则使用嵌入式版本。
启动derby引擎(服务器或嵌入式)时,它将获得对数据库文件的独占访问权限。
如果需要从多个Java虚拟机(JVM)访问单个数据库,则需要安装服务器解决方案。您可以允许来自需要访问该数据库的多个JVM的应用程序连接到服务器。
有关详细信息,请参阅Double-booting system behavior。
答案 1 :(得分:5)
我意识到这是一个老问题,但我想我可能会在解决方案上添加更多细节,因为当前接受的答案中的链接已被破坏。
可以在已使用嵌入式数据库的JVM中运行Derby Network Server。使用嵌入式Derby数据库的代码不需要更改任何内容,并且可以继续使用DB,但是在启动Derby Network Server的情况下,其他程序可以连接到derby并访问数据库。
您需要做的就是确保derbynet.jar is on the classpath
然后您可以执行以下操作之一
在derby.properties文件中包含以下行:derby.drda.startNetworkServer=true
在java start中将该属性指定为系统属性
java -Dderby.drda.startNetworkServer=true
您可以使用NetworkServerControl API从Java应用程序中的单独线程启动网络服务器:
NetworkServerControl server = new NetworkServerControl();
server.start (new PrintWriter(System.out));
此处有更多详情:http://db.apache.org/derby/docs/10.9/adminguide/tadminconfig814963.html
请记住,这样做不会在此连接上启用任何安全性,因此在生产系统上执行此操作不是一个好主意。虽然可以添加安全性,但可以在此处记录:http://db.apache.org/derby/docs/10.9/adminguide/cadminnetservsecurity.html
答案 2 :(得分:1)
另外两个想法:
答案 3 :(得分:1)
如果您可以负担内存并且不需要最新数据,那么您可以通过创建内存副本从多个JVM访问只读数据库:
ij> connect 'jdbc:derby:memory:memdb;restoreFrom=mydb';