强制hibernate在读取之前重新加载hsqldb文件

时间:2016-04-22 09:28:51

标签: java spring hibernate hsqldb

我有以下情况:

  • 两个使用相同in file hsqldb
  • 的应用程序
  • app1仅从db写入/删除,app2仅从中读取
  • app1app2更新后发送事件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也无法阅读更新。

1 个答案:

答案 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");