2014-03-04 52 views
0

我无法使复制在两个db4o数据库之间完全运行。我遵循了很多教程,我的代码似乎与他们一致(显然不是)。输出表明ReplicationSession检测到更改,但不会复制其他数据库中的更改。db4o到db4o复制不完全复制

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) 
    { 
     ... 
    } 
} 

这里是我已经从一个计时器每787-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(); 
} 

作品就好了创建并写入到数据库中的新对象运行的实际同步。

如果我从其中一个数据库(如字段更改)写入更改的对象,则运行时的同步方法将会检测到存在更改的对象,并且事实上它是正确的,并且其字段已更改。但是,我没有看到该对象正在其他数据库中复制。其字段与更改的对象字段不同。

难道我只是对db4o的复制能力有一种误解吗?作为第二年,我的联赛有点不合时宜,但如果任何人都可以看到我的错在哪里,我将不胜感激。

+0

上面的代码是使用bd4o的8.0.249.16098,drs ... – Spleen

+0

我已经更改为版本7.12,并且具有完全复制功能。由于这两个版本之间有很大的不同,方法不同,但我又一次遵循了文档中的教程。我不知道为什么上面的版本8不起作用,所以我会说这是没有答案,只是解决。 – Spleen

回答

0

我设法让版本8正确复制。我没有完全按照教程做出假设(虽然没有澄清,但仍然是一个假设)。

似乎在同步时实例化ReplicationSession和ReplicationProviders是至关重要的。我改变了我的代码,以便在SyncDatabases()这些被创建和不保存(我猜垃圾回收照顾他们)。

public void syncDatabases() 
{   
    // First get the changes of the two replication-partners 
    Db4oEmbeddedReplicationProvider providerA = new Db4oEmbeddedReplicationProvider(hostContainer); 
    Db4oEmbeddedReplicationProvider providerB = new Db4oEmbeddedReplicationProvider(clientContainer); 
    ReplicationSession replication = Replication.begin(providerA, providerB); 

    ObjectSet<Object> changesOnHost = replication.providerA().objectsChangedSinceLastReplication(); 
    ObjectSet<Object> changesOnClient = replication.providerB().objectsChangedSinceLastReplication(); 

    // 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(); 

    replication.replicateDeletions(Object.class); 
} 

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