2014-03-04 64 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初始化。