【发布时间】:2011-04-10 08:34:12
【问题描述】:
我想要做的:我的应用程序与 Derby DB 完全连接,我想在 DB(只读)中并行(使用不同的工具)。
我不确定 Derby 在内部实际上是如何工作的,但我知道我只能与 Derby DB 建立 1 个活动连接。 但是,由于 DB 仅包含我的 HDD 上的文件,我不应该能够以只读模式打开到它的其他连接吗?
是否有任何工具可以做到这一点?
【问题讨论】:
我想要做的:我的应用程序与 Derby DB 完全连接,我想在 DB(只读)中并行(使用不同的工具)。
我不确定 Derby 在内部实际上是如何工作的,但我知道我只能与 Derby DB 建立 1 个活动连接。 但是,由于 DB 仅包含我的 HDD 上的文件,我不应该能够以只读模式打开到它的其他连接吗?
是否有任何工具可以做到这一点?
【问题讨论】:
运行 Apache Derby DB 有两种可能性。
您可以根据驱动程序大小识别类型。如果驱动程序有超过 2MB,您使用嵌入式版本。
当您启动 derby 引擎(服务器或嵌入式)时,它会获得对数据库文件的独占访问权限。
如果您需要从多个 Java 虚拟机 (JVM) 访问单个数据库,则需要部署服务器解决方案。您可以允许来自多个 JVM 的需要访问该数据库的应用程序连接到服务器。
【讨论】:
另外两个想法:
【讨论】:
我意识到这是一个老问题,但我想我可能会在解决方案上添加更多细节,因为当前接受的答案中的链接已损坏。
可以在已经使用嵌入式数据库的 JVM 中运行 Derby Network Server。使用嵌入式 Derby 数据库的代码无需更改任何内容,可以按原样继续使用数据库,但随着 Derby Network Server 启动,其他程序可以连接到 derby 并访问数据库。
您需要做的就是确保derbynet.jar is on the classpath
然后您可以执行以下操作之一
在 derby.properties 文件中包含以下行:derby.drda.startNetworkServer=true
在 java 启动时将该属性指定为系统属性
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
【讨论】:
如果您负担得起内存并且不需要最新数据,那么您可以通过创建内存副本从多个 JVM 访问只读数据库:
ij> connect 'jdbc:derby:memory:memdb;restoreFrom=mydb';
【讨论】: