Java db4o到db4o复制不完全复制
我很难让复制在两个db4o数据库之间完全正常工作。我已经遵循了许多教程,我的代码似乎与它们相当(虽然显然不是)。输出表明ReplicationSession正在检测更改,但它没有复制其他数据库中的更改Java db4o到db4o复制不完全复制,java,database-replication,db4o,Java,Database Replication,Db4o,我很难让复制在两个db4o数据库之间完全正常工作。我已经遵循了许多教程,我的代码似乎与它们相当(虽然显然不是)。输出表明ReplicationSession正在检测更改,但它没有复制其他数据库中的更改 private ReflectiveDatabase() { openDb(); providerA = new Db4oEmbeddedReplicationProvider(hostContainer); providerB = new Db4oEmbeddedRepl
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中的上述内容不起作用,所以我会说这没有得到回答,只是解决了问题。