在SymmetricDS Embedded中创建SYM表

时间:2015-12-03 15:03:10

标签: java symmetricds

我试图在使用H2数据库的java应用程序中嵌入Symmetricds 3.7。该应用程序是一个客户端节点,使用SymmetricDS API中的类ClientSymmetricEngine

主节点运行独立的symmetricds服务器,当我使用应用程序中先前测试的已配置数据库时,我能够同步数据。

在新数据库上运行应用程序时,会抛出此异常:

java.lang.IllegalStateException: This node has not been configured.Could not find a row in the identity table
at 
org.jumpmind.symmetric.service.impl.RegistrationService.openRegistration(RegistrationService.java:562)
at 
org.jumpmind.symmetric.service.impl.RegistrationService.openRegistration(RegistrationService.java:530)
at 
org.jumpmind.symmetric.service.impl.RegistrationService.openRegistration(RegistrationService.java:519)
at 
org.jumpmind.symmetric.AbstractSymmetricEngine.openRegistration(AbstractSymmetricEngine.java:890)
at syncdemo.ClientNode.<init>(ClientNode.java:32)
at syncdemo.SyncDemo.main(SyncDemo.java:37)

如何通过API在客户端节点中创建SYM表?

我从here获得了同步代码。 ClientNode类中使用的内容如下:

public class ClientNode {
private ClientSymmetricEngine cEngine;
private File propFile;


public ClientNode(File file) throws FileNotFoundException, IOException {
    propFile = file;
    Properties propertiesFile = new Properties();
    propertiesFile.load(new FileReader(propFile));
    cEngine = new ClientSymmetricEngine(propertiesFile, true);
    getcEngine().openRegistration("store", "001");
    getcEngine().setup();
    getcEngine().start();
}

public ClientSymmetricEngine getcEngine() {
    return cEngine;
}

public void setcEngine(ClientSymmetricEngine cEngine) {
    this.cEngine = cEngine;
}
}

从这里调用clientNode类:

public class SyncDemo {       

public static void main(String[] args) {

      try 
        {
        new ClientNode(new File("/client.properties"));
        }
        catch (Exception e) 
        {
        e.printStackTrace();
        }

}
}

client.properties文件的内容:

external.id=001
engine.name=store-001
sync.url=http://192.168.1.107:31415/sync/corp-000
group.id=store
db.url=jdbc:h2:./syncdata/store001;AUTO_SERVER=TRUE;LOCK_TIMEOUT=60000
db.driver=org.h2.Driver
db.user=symmetric
registration.url=http://192.168.1.107:31415/sync/corp-000
db.password=
auto.config.database=true  

我刚才注意到,即使SYM表存在于客户机节点的数据库中,除非在SYM_NODE和SYM_NODE_IDENTITY表中插入适当的数据,否则抛出相同的异常。

2 个答案:

答案 0 :(得分:0)

通过修改代码来解决问题:

public ClientNode(File file) throws FileNotFoundException, IOException {
propFile = file;
Properties propertiesFile = new Properties();
propertiesFile.load(new FileReader(propFile));
cEngine = new ClientSymmetricEngine(propertiesFile, true);
getcEngine().setup();
getcEngine().openRegistration("store", "001");
getcEngine().start();
}

我认为setup()函数在数据库中创建配置表,需要在注册前调用。

答案 1 :(得分:0)

接受的答案对我不起作用,我仍然有同样的错误。我得到了它结合了接受的答案的变化,加上理解:

  1. 每个客户端节点上的sync.url 在注册时来自服务器。
  2. registration.url告诉客户端节点在哪里找到配置(主)节点。
  3. 如果您曾经搞过其中任何一个,那么sym_表中的某些内容就会搞砸了。您可能最好擦除数据库并重新开始。
  4. sym_ tables不会在嵌入式应用中自动填充。您必须手动填充它们。 .../samples/insert_sample.sql文件是您的朋友。