将SymmetricDS连接到现有H2数据库文件

时间:2015-11-28 13:53:15

标签: java database h2 symmetricds

我需要使用SymmetricDS复制H2数据库文件。

我可以使用此网址以嵌入模式从Web控制台访问数据库:

jdbc:h2:file:E:/Folder/database;AUTO_SERVER=TRUE;IFEXISTS=TRUE;

但是在symmtericds的节点属性文件中使用相同的url会引发以下错误:

ERROR [server-000] [AbstractSymmetricEngine] [symmetric-engine-startup-0] Could not get a connection to the database: Cannot create PoolableConnectionFactory (IO Exception: "E:/Folder/database outside D:/symmetric-server-3.7.26/tmp/h2" [90028-182]).  Waiting for 10 seconds before trying to connect to the database again.

虽然如果在symmetricds的节点属性文件中使用以下url,一切正常但数据库是在symmetric-server-3.7.26 / tmp / h2目录中创建的。

jdbc:h2:file:database;AUTO_SERVER=TRUE;

在过去的几天里我没有运气解决这个问题。

非常感谢任何形式的帮助。

通过H2文档我发现这种行为是由于-baseDir选项:http://www.h2database.com/html/advanced.html#remote_access

但是如何自动设置此选项以及如何禁用它??

对该问题做了一些广泛的研究,根本原因结果是 AbstractCommandLauncher SymmetricDS的静态块:

static {
    String symHome = System.getenv("SYM_HOME");
    if (symHome == null) {
        symHome = ".";
    }
    System.setProperty("log4j.sym.home", symHome);
    if (isBlank(System.getProperty("h2.baseDir"))) {
       System.setProperty("h2.baseDir", symHome + "/tmp/h2");
    }
    DEFAULT_SERVER_PROPERTIES = System.getProperty(SystemConstants.SYSPROP_SERVER_PROPERTIES_PATH, symHome + "/conf/symmetric-server.properties");
    log = LoggerFactory.getLogger(AbstractCommandLauncher.class);
    initFromServerProperties();
}

事实证明,必须修改SymmetricDS的源代码才能解决它。

1 个答案:

答案 0 :(得分:0)

不能完全禁用此行为,但可以通过在运行SymmetricDS时设置-Dh2.baseDir来覆盖它。原始答案是here