我目前正在开发一个由H2数据库支持的java应用程序,该数据库将根据其模型定期生成各种文件(频率可配置,目前默认为每小时一次)。为了支持这种批量行为,我需要在用户请求上提供两个版本的数据模型 - 可以自由编辑的“当前”版本,以及“只有”的“强制”版本,可以用来查询系统的实际行为。我提出的解决方案是:
- 我可以将历史数据添加到数据库并从中派生强制版本。我们对这个选项很谨慎,因为模型非常复杂,有许多多对多的关系,我们不想让事情变得更糟(我甚至不确定如何保持一个容易查询的连接历史表通过Hibernate)
- 我可以将数据库复制到第二个位置,并提供对两者的访问权限。这是有人向我建议的第一个解决方案,但我不喜欢在等待副本发生时不断关闭所有连接的想法。
- 我可以并排维护这两个数据库,并提供我自己的EntityManager实现,用于包装每个数据库的实体管理器,将事务提交到当前版本,并刷新到强制版本但不提交,以便其他EntityManagers不会看到更改。我开始实现这一点,但它感觉很脆弱,如果应用程序重新启动而没有进行提交(很可能;关闭完成文件写入并不总是可能),那么它将回到执行完整副本先写。
- 我可以维护两个数据库并保留所有进入的事务对象的列表。然后在文件写入时,可以将存储的事务应用于强制模型并清除。这是我目前倾向于它,它应该是可靠的,因为事务持续排队并写入幂等和原子,所以它将适应崩溃等。仍然感觉应该有一个更优雅的方式。 / LI>
以简单且合理的方式提供一种像这样的主动可用的历史快照还有什么更好的吗?