【问题标题】:Have additional connections to Derby (read-only)与 Derby 有其他连接(只读)
【发布时间】:2011-04-10 08:34:12
【问题描述】:

我想要做的:我的应用程序与 Derby DB 完全连接,我想在 DB(只读)中并行(使用不同的工具)。

我不确定 Derby 在内部实际上是如何工作的,但我知道我只能与 Derby DB 建立 1 个活动连接。 但是,由于 DB 仅包含我的 HDD 上的文件,我不应该能够以只读模式打开到它的其他连接吗?

是否有任何工具可以做到这一点?

【问题讨论】:

    标签: database-connection derby


    【解决方案1】:

    运行 Apache Derby DB 有两种可能性。

    1. Embedded:你在你的应用程序中运行 DB → 只有一个连接可能
    2. Client:您在单独的进程中将数据库作为服务器启动 → 具有许多连接的经典数据库

    您可以根据驱动程序大小识别类型。如果驱动程序有超过 2MB,您使用嵌入式版本。

    更新

    当您启动 derby 引擎(服务器或嵌入式)时,它会获得对数据库文件的独占访问权限。

    如果您需要从多个 Java 虚拟机 (JVM) 访问单个数据库,则需要部署服务器解决方案。您可以允许来自多个 JVM 的需要访问该数据库的应用程序连接到服务器。

    详情见Double-booting system behavior

    【讨论】:

    • 它是嵌入的。不过,我希望有一种方法可以再次在单独的 JVM 中打开数据库(只读)。 :-/
    • 对于 Derby(和大多数其他数据库),在另一个进程正在写入时,从技术上讲不可能获得一致的数据库只读“视图”,因为写入过程可能会覆盖数据(“更新地点')。
    【解决方案2】:

    另外两个想法:

    1. 在您的应用程序中,关闭数据库并在数据库未主动使用时关闭连接。这样您的应用程序就不会干扰另一个试图打开数据库的工具。
    2. 通过备份创建数据库副本(您可以在应用程序打开数据库时执行此操作),然后将该备份恢复到磁盘上的单独位置。然后,您可以使用其他工具轻松访问复制的数据库。

    【讨论】:

      【解决方案3】:

      我意识到这是一个老问题,但我想我可能会在解决方案上添加更多细节,因为当前接受的答案中的链接已损坏。

      可以在已经使用嵌入式数据库的 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

      【讨论】:

      • 因此您建议同时使用嵌入式连接和服务器连接。我不确定这是否有效并且可能导致数据损坏,来自db.apache.org/derby/docs/10.0/manuals/develop/develop79.html - 带有嵌入式连接“一次只有一个应用程序可以访问数据库,并且一次只有一个应用程序可以访问特定系统。当使用 1.4 之前的 JVM,Derby 可能不会阻止多个应用程序同时访问同一个 Derby 系统,但不允许这样做,因为这样的访问会破坏所涉及的数据库。”
      【解决方案4】:

      如果您负担得起内存并且不需要最新数据,那么您可以通过创建内存副本从多个 JVM 访问只读数据库:

      ij> connect 'jdbc:derby:memory:memdb;restoreFrom=mydb';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-05
        • 1970-01-01
        相关资源
        最近更新 更多