簡體   English   中英

從db4o到db4o復制的復制不完全

[英]db4o to db4o replication not quite replicating

我無法使復制在兩個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();
}

對於創建並寫入數據庫的新對象而言,它工作得很好。

如果我從這些數據庫之一寫入更改的對象(例如字段更改),則運行時sync方法將發現存在更改的對象,而實際上是正確的對象及其字段已更改。 但是,我沒有看到該對象在另一個數據庫中被復制。 它的字段與更改的對象的字段不同。

我是否只是對db4o的復制能力有誤解? 這已經是我第二年的比賽了,但是如果有人能看到我要去哪里錯了,我將不勝感激。

我設法使版本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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM