我有一个 H2 数据库文件,我需要使用SymmetricDS进行复制。
我可以使用以下网址以嵌入式模式从 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 。
但是如何自动设置此选项以及如何禁用它..?
对这个问题进行了一些广泛的研究,根本原因原来是SymmetricDS的AbstractCommandLauncher类的静态块:
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的源代码才能解决它。