与内存中的 hsqldb 对称
Posted
技术标签:
【中文标题】与内存中的 hsqldb 对称【英文标题】:symmetricds with in-memory hsqldb 【发布时间】:2017-12-05 13:35:29 【问题描述】:所以,我正在尝试将 mysql db 迁移到内存中的 hsqldb。我为此使用对称。我已将 symbolicds 作为连接到 mysql 的服务启动,具有以下属性:
engine.name=corp-000
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/corp?tinyInt1isBit=false
db.user=root
db.password=
registration.url=
sync.url=http://localhost:31415/sync/corp-000
group.id=corp
external.id=000
job.purge.period.time.ms=7200000
job.routing.period.time.ms=5000
job.push.period.time.ms=10000
job.pull.period.time.ms=10000
initial.load.create.first=true
auto.registration=true
auto.reload=true
使用所需数据创建并加载所有 sym 表。
接下来,我使用 ClientSymmetricEngine 通过 java 创建了一个客户端节点。这是我的java代码:
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");// client is the name of the node group and 001 is the ID
getcEngine().setup();
getcEngine().start();
public ClientSymmetricEngine getcEngine()
return cEngine;
这是 clientNode 属性文件:
engine.name=store-001
db.driver=org.hsqldb.jdbcDriver
db.url=jdbc:hsqldb:mem:store001
db.user=sa
db.password=
registration.url=http://localhost:31415/sync/corp-000
group.id=store
external.id=001
job.routing.period.time.ms=5000
job.push.period.time.ms=10000
job.pull.period.time.ms=10000
以下是我启动 clientNode 并从运行在同一 JVM 上的复制表中获取数据的代码:
public static void main(String[] args)
try
new ClientNode(new File("C:/Train/src/main/resources/store-001.properties"));
Thread.currentThread();
Thread.sleep(40000);
Class.forName("org.hsqldb.jdbcDriver");
con = DriverManager.getConnection("jdbc:hsqldb:mem:store001;create=false", "sa", "");
System.out.println("Connection created successfully");
stmt = con.createStatement();
rs = stmt.executeQuery("SELECT item_id, name FROM item");
while (rs.next())
System.out.println(rs.getInt("item_id") + " | " + rs.getString("name"));
catch (Exception e)
e.printStackTrace(System.out);
当我运行 main() 时,我看到 symmetricds 执行从 mysql 到 hsql 的复制。但是当我尝试从 hsql 获取相同的数据时,我得到 table object not found 异常。
java.sql.SQLException: user lacks privilege or object not found: ITEM
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.JDBCStatement.executeQuery(Unknown Source)
at hsqlDB.FetchData.<init>(FetchData.java:24)
at hsqlDB.ConnectDatabase.main(ConnectDatabase.java:15)
附加完整的堆栈跟踪。
如果有人能告诉我我在这里做错了什么,我将不胜感激。
【问题讨论】:
@Boris:如果您再次查看我的问题,您会注意到我使用的是内存中的 hsqldb,而不是基于文件的 hsqldb。是的,我的网址和语法都是正确的。是否有任何其他原因可能会发生这种情况?一定要看看,让我知道 【参考方案1】:如果您查看它用于创建表的语句,表名和列名被引用,这使得它们区分大小写。更改您的 SQL 查询以使用相同的大小写和引号,如下所示:
rs = stmt.executeQuery("SELECT \"item_id\", \"name\" FROM \"item\"");
【讨论】:
以上是关于与内存中的 hsqldb 对称的主要内容,如果未能解决你的问题,请参考以下文章