【问题标题】:force hibernate to reload the hsqldb file before reading强制休眠在读取之前重新加载 hsqldb 文件
【发布时间】:2016-04-22 09:28:51
【问题描述】:

我有以下场景:

  • 两个应用程序使用相同的in file hsqldb
  • app1 仅写入/删除 dbapp2 仅读取它
  • 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())

app2 方面,但即便如此,app2 也无法读取更新。

【问题讨论】:

  • hsqldb使用的是什么表类型?
  • @Evgeny 表类型是什么意思?桌子的构成?
  • 我的表格是由hibernate 自动创建的。我查看了sql command,发现这些表是使用create table 创建的,所以它是memory table
  • 看来服务器模式是进程内(独立)模式。是这样吗? hsqldb.org/doc/guide/ch01.html#N1013D

标签: java spring hibernate hsqldb


【解决方案1】:

HSQLDB 文档状态:

使用 CREATE TABLE 命令时,内存表是默认类型。它们的数据完全保存在内存中,但对其结构或内容的任何更改都会写入 .script 文件。 下次打开数据库时会读取脚本文件,并重新创建 MEMORY 表及其所有内容。

由于两个应用程序都使用 独立内存 表,因此数据库状态可以在不重新启动的情况下同步。从理论上讲,app2 中的 hsqldb 实例可以通过使用SHUTDOWN sql command 关闭它并随后在声明新连接时启动来强制重新加载其状态。但这看起来不是一个好的解决方案。如果两个实例试图将它们的状态保存到同一个文件中,也可能存在冲突。

如果两个应用程序使用一个数据库,我建议在Server mode 中使用更合适的 hsqldb。服务器模式可以在单独的 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");

【讨论】:

  • 谢谢,它有效!我没有使用DriverManager 连接到server,而是使用DataSource,所以我的代码没有太大变化,只添加了server
猜你喜欢
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 2014-03-23
  • 1970-01-01
  • 2011-04-05
  • 2014-03-02
相关资源
最近更新 更多