我有以下情况:
in file hsqldb
app1
仅从db
写入/删除,app2
仅从中读取app1
在app2
更新后发送事件db
并发出信息app2
无法读取新值,他只看到旧值我试着写:
Session session = sessionFactory.getCurrentSession();
try {
session.setFlushMode(FlushMode.AUTO);
session.saveOrUpdate(cluster);
session.flush();
return true;
} catch (Exception e) {
LOG.error("Failed saving cluster {}!", cluster.getName(), e);
return false;
}
阅读:
Session session = sessionFactory.getCurrentSession();
session.setCacheMode(CacheMode.REFRESH);
try {
return (List<Cluster>) session
.createCriteria(Cluster.class)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.list();
} catch (Exception e) {
LOG.error("Error while trying to read the clusters from file!", e);
return new ArrayList<>();
}
但遗憾的是这不起作用。
我也尝试关闭连接,然后重新打开,但这也不起作用。
更新[1]:
我刚刚设置:
basicDataSource.setDefaultTransactionIsolation(Isolation.READ_UNCOMMITTED.value())
{p}位于app2
侧,但即使如此,app2
也无法阅读更新。
答案 0 :(得分:2)
HSQLDB文件说明:
使用CREATE TABLE命令时,内存表是缺省类型。它们的数据完全保存在内存中,但对其结构或内容的任何更改都会写入.script文件。 下次打开数据库时会读取脚本文件,并使用其所有内容重新创建MEMORY表。
由于两个应用程序都将独立与内存表一起使用,因此无需重启即可同步 。理论上,app2
中的hsqldb实例可以通过使用SHUTDOWN
sql command关闭它来强制重新加载其状态,并因此在声明新连接时启动。但它看起来不是一个好的解决方案。如果两个实例尝试将其状态保存到同一文件,则可能会发生冲突。
我建议在Server mode中使用hsqldb更适合两个应用程序使用一个db的情况。服务器模式可以在单独的JVM实例上启动,也可以作为app1
的一部分启动。
Server server = new Server();
server.setDatabaseName(0, "test");
server.setDatabasePath(0, "file:test");
server.setLogWriter(new PrintWriter(System.out));
server.setErrWriter(new PrintWriter(System.err));
server.start();
app2
将能够使用
DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/test");