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

Connect SymmetricDS to an Existing H2 Databse File

我有一个 H2 数据库文件,我需要使用 SymmetricDS 进行复制。

我可以使用这个 url:

在嵌入式模式下从 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 class 的静态块 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 的源代码必须修改才能解决。

此行为无法完全禁用,但可以通过设置 -Dh2.baseDir 而 运行 SymmetricDS 来覆盖它。原答案是here