Apache 嵌入式德比复制 - 从实例不返回连接

Apache embedded derby replication - slave instance not returning the connection

我正在尝试在 apache 嵌入式 derby 数据库中设置复制。 我正在按照 DerbyAdmin guide 来实现相同的 -

按照这个,我必须先启动从数据库,然后再启动主数据库。但是,一旦我尝试在从属 derby 实例方法调用上获取连接,就会卡住。它从来没有 return 连接。以下是相同的代码 -

public static Connection getConnection(){
    Class.forName("org.apache.derby.jdbc.EmbeddedDriver");  
    String url = "jdbc:derby:<slave db location>;startSlave=true";
    System.out.println("about to fetch connection");
    Connection con= null;
    try{
        con=DriverManager.getConnection(url, "root", "root");
    }catch(Exception e){
        e.printStackTrace();
    }
    System.out.println("return con -"+con);
    return con;
}

输出

about to fetch connection

为了确保所有的 derby 库是否都包含在项目中,我尝试在没有 startSlave=true 属性的情况下获取连接,它确实 return 连接。

public static Connection getConnection(){
    Class.forName("org.apache.derby.jdbc.EmbeddedDriver");  
    String url = "jdbc:derby:<slave db location>;";
    System.out.println("about to fetch connection");
    Connection con= null;
    try{
        con=DriverManager.getConnection(url, "root", "root");
    }catch(Exception e){
        e.printStackTrace();
    }
    System.out.println("return con -"+con);
    return con;
}

输出

about to fetch connection

return con -org.apache.derby.impl.jdbc.EmbedConnection@2022850302 (XID = 420), (SESSIONID = 1), (DATABASE = I:/R&D/derby replication/Slave/replMaster), (DRDAID = null)

我尝试检查 derby.log 文件,但日志文件也是空的。 让我知道出了什么问题。

提前致谢。

经过很长时间的研究,我发现 slave 应该是这样工作的。

与我的假设不同,我们必须先启动 master,然后再启动 slave。

以下是我为使其工作而执行的步骤-

  1. 以嵌入式模式启动 derby 调用它实例 masterCandidate 并通过调用下面的 SP-

    冻结数据库

    call SYSCS_UTIL.SYSCS_FREEZE_DATABASE()

  2. 复制粘贴数据库(derby文件夹)到slave位置(注意不要停止这个derby实例)

  3. 现在开始德比 URL 调用它实例 slaveCandidate-

    jdbc:derby:<slave db location>;startSlave=true 不要等待 return 连接的方法,当我们连接主 derby 实例时,它将 return 低于异常 -

ERROR XRE08: Replication slave mode started successfully for database ''. Connection refused because the database is in replication slave mode.

  1. 使用 startMaster 属性创建到 masterCandidate 实例的新连接并使其成为主节点 -

    jdbc:derby:;startMaster=true;slaveHost=slaveHost;slavePort=slavePort

  2. 现在你已经准备好read/write on master,从现在开始不需要传递startMaster=true属性,而master连接

一旦 masterCandidate 实例关闭,slave 自动成为 master。

直到 master 总是从 slave 获取连接 return 上面提到的(第 3 点)异常。

一旦 master 宕机,我们就可以在 slaveCandidate 上获取连接而无需传递属性。

jdbc:derby:<slave db location>