Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java db4o到db4o复制不完全复制_Java_Database Replication_Db4o - Fatal编程技术网

Java db4o到db4o复制不完全复制

Java db4o到db4o复制不完全复制,java,database-replication,db4o,Java,Database Replication,Db4o,我很难让复制在两个db4o数据库之间完全正常工作。我已经遵循了许多教程,我的代码似乎与它们相当(虽然显然不是)。输出表明ReplicationSession正在检测更改,但它没有复制其他数据库中的更改 private ReflectiveDatabase() { openDb(); providerA = new Db4oEmbeddedReplicationProvider(hostContainer); providerB = new Db4oEmbeddedRepl

我很难让复制在两个db4o数据库之间完全正常工作。我已经遵循了许多教程,我的代码似乎与它们相当(虽然显然不是)。输出表明ReplicationSession正在检测更改,但它没有复制其他数据库中的更改

private ReflectiveDatabase()
{
    openDb();
    providerA = new Db4oEmbeddedReplicationProvider(hostContainer);
    providerB = new Db4oEmbeddedReplicationProvider(clientContainer);

    //Start a new ReplicationSession with event for replacing newest object on conflict.
    replication = Replication.begin(providerA, providerB,
    new ReplicationEventListener() {
        @Override
        public  void onReplicate(ReplicationEvent replicationEvent) {
            if (replicationEvent.isConflict()) {
                ObjectState stateDesktop = replicationEvent.stateInProviderA();
                ObjectState stateMobile = replicationEvent.stateInProviderB();

                if (stateDesktop.modificationDate() >= stateMobile.modificationDate()) {
                    replicationEvent.overrideWith(stateDesktop);
                } else {
                    replicationEvent.overrideWith(stateMobile);
                }
            }
        }
    });   
}

public EmbeddedConfiguration configure()
{
    EmbeddedConfiguration configuration = Db4oEmbedded.newConfiguration();
    configuration.file().generateUUIDs(ConfigScope.GLOBALLY);
    configuration.file().generateCommitTimestamps(true);
    return configuration;
}

public void openDb()
{
    // try to connect to the host
    if(hostContainer != null) hostContainer.close();

    try
    {
        hostContainer = Db4oEmbedded.openFile(configure(), "local1.db4o");
    }
    catch (com.db4o.ext.Db4oIOException e)
    {
        ...
    }

    // try to connect to the client
    if(clientContainer != null) 
    {
        clientContainer.close();
    }

    try
    {
        clientContainer = Db4oEmbedded.openFile(configure(), "local2.db4o");
    }
    catch (com.db4o.ext.Db4oIOException e)
    {
        ...
    }
}
这是我每8秒用定时器运行的实际同步

public void syncDatabases()
{        
    // First get the changes of the two replication-partners
    ObjectSet<Object> changesOnHost = replication.providerA().objectsChangedSinceLastReplication();
    ObjectSet<Object> changesOnClient = replication.providerB().objectsChangedSinceLastReplication();
    System.out.println("Changes on Server: " + changesOnHost.size());
    System.out.println("Changes on Client: " + changesOnClient.size());
    // then iterate over both change-sets and replicate it
    for (Object changedObjectOnClient : changesOnClient)
    {
        replication.replicate(changedObjectOnClient);
    }
    for (Object changedObjectOnHost : changesOnHost)
    {
        replication.replicate(changedObjectOnHost);
    }
    replication.commit();
}

public void writeToClient(Object object)
{
    clientContainer.store(object);
    clientContainer.commit();
}
public void syncDatabases()
{        
//首先获取两个复制伙伴的更改
ObjectSet changesOnHost=replication.providerA().objectschangedsincellastplication();
ObjectSet changesOnClient=replication.providerB().objectsChangedSinceLastReplication();
System.out.println(“服务器上的更改:+changesOnHost.size());
System.out.println(“客户端上的更改:+changesOnClient.size());
//然后迭代两个变更集并复制它
for(对象changedObjectOnClient:changesOnClient)
{
replication.replicate(changedObjectOnClient);
}
对于(对象changedObjectOnHost:changesOnHost)
{
replication.replicate(changedObjectOnHost);
}
replication.commit();
}
公共无效writeToClient(对象)
{
clientContainer.store(对象);
commit();
}
适用于创建并写入数据库的新对象

private ReflectiveDatabase()
{
    openDb();
    providerA = new Db4oEmbeddedReplicationProvider(hostContainer);
    providerB = new Db4oEmbeddedReplicationProvider(clientContainer);

    //Start a new ReplicationSession with event for replacing newest object on conflict.
    replication = Replication.begin(providerA, providerB,
    new ReplicationEventListener() {
        @Override
        public  void onReplicate(ReplicationEvent replicationEvent) {
            if (replicationEvent.isConflict()) {
                ObjectState stateDesktop = replicationEvent.stateInProviderA();
                ObjectState stateMobile = replicationEvent.stateInProviderB();

                if (stateDesktop.modificationDate() >= stateMobile.modificationDate()) {
                    replicationEvent.overrideWith(stateDesktop);
                } else {
                    replicationEvent.overrideWith(stateMobile);
                }
            }
        }
    });   
}

public EmbeddedConfiguration configure()
{
    EmbeddedConfiguration configuration = Db4oEmbedded.newConfiguration();
    configuration.file().generateUUIDs(ConfigScope.GLOBALLY);
    configuration.file().generateCommitTimestamps(true);
    return configuration;
}

public void openDb()
{
    // try to connect to the host
    if(hostContainer != null) hostContainer.close();

    try
    {
        hostContainer = Db4oEmbedded.openFile(configure(), "local1.db4o");
    }
    catch (com.db4o.ext.Db4oIOException e)
    {
        ...
    }

    // try to connect to the client
    if(clientContainer != null) 
    {
        clientContainer.close();
    }

    try
    {
        clientContainer = Db4oEmbedded.openFile(configure(), "local2.db4o");
    }
    catch (com.db4o.ext.Db4oIOException e)
    {
        ...
    }
}
如果我从其中一个数据库中写入一个已更改的对象,例如字段更改,那么运行sync方法时将检测到有一个已更改的对象,并且它实际上是正确的对象,并且它的字段已更改。但是,我没有看到在另一个数据库中复制该对象。其字段与更改对象的字段不同


我只是对db4o的复制能力有误解吗?作为第二年,这有点超出我的能力范围,但如果有人能看到我的错误,我将不胜感激。

我成功地让版本8正确复制。我没有完全按照教程进行操作,并做出了假设(尽管没有澄清,这仍然是一个假设)

似乎在同步时实例化ReplicationSession和ReplicationProviders是至关重要的。我更改了代码,以便在SyncDatabases()中创建而不是保存这些数据库(我猜垃圾收集会处理它们)

public void syncDatabases()
{        
//首先获取两个复制伙伴的更改
db4oEmbeddedReplicationProviderA=新的Db4oEmbeddedReplicationProvider(主机容器);
db4oEmbeddedReplicationProviderB=新的Db4oEmbeddedReplicationProvider(clientContainer);
ReplicationSession replication=replication.begin(providerA,providerB);
ObjectSet changesOnHost=replication.providerA().objectschangedsincellastplication();
ObjectSet changesOnClient=replication.providerB().objectsChangedSinceLastReplication();
//然后迭代两个变更集并复制它
for(对象changedObjectOnClient:changesOnClient)
{
replication.replicate(changedObjectOnClient);
}
对于(对象changedObjectOnHost:changesOnHost)
{
replication.replicate(changedObjectOnHost);
}
replication.commit();
replication.replicateDeletions(Object.class);
}

构造函数只是运行openDb()来初始化objectContainers。

上面的代码使用的是bd4o和drs的8.0.249.16098。我已经切换到7.12版,并且按照预期进行了完全复制。方法不同,因为两个版本之间发生了很多变化,但我还是遵循了文档中的教程。我不知道为什么版本8中的上述内容不起作用,所以我会说这没有得到回答,只是解决了问题。