我需要审核应用程序中某些实体的更改,并考虑使用JaVers。我喜欢询问JaVers提供的审计数据。 Hibernate Envers看起来不错,但它将数据存储在同一个数据库中。
以下是我的要求:
据我所知,JaVers不是为上述而设计的,但似乎有可能适应上述目标。以下是:
'
final Connection dbConnection =
DriverManager.getConnection("jdbc:mysql://localhost:3306/javers", "root", "root");
ConnectionProvider connectionProvider = new ConnectionProvider() {
@Override
public Connection getConnection() {
//suitable only for testing!
return dbConnection;
}
};
JaversSqlRepository sqlRepository = SqlRepositoryBuilder
.sqlRepository()
.withConnectionProvider(connectionProvider)
.withDialect(DialectName.MYSQL).build();
问题:
仅供参考:与此问题无关,但这里有一些我能想到的其他挑战以及我计划如何解决这些挑战:
afterTransactionCompletion
并仅提交由该事务更新的对象来实现。答案 0 :(得分:1)
有趣的问题。 首先是精神恍惚。所有JaVers核心模块都旨在将审计数据与应用程序数据分离。如您所述,用户提供了一个供JaVers使用的ConnectionProvider。它可以是您想要的任何数据库。
不适用于多个数据库的是用于SQL的Spring集成模块,因此javers-spring-jpa
和javers-spring-boot-starter-sql
。它们只涵盖了最常见的场景,因此应用程序和JaVers的数据库相同。
你是对的缺乏异步提交。幸运的是,它只能在JaversCore
中实现,而无需更改存储库。
API可以是:
CompletableFuture<Commit> javers.commitAsync(..., Executor);
首先,Javers将拍摄用户对象的快照,速度很快,因此可以在当前线程中完成。
然后,DB读取(加载最新快照)和DB写入(插入新快照)可以异步完成(提交给给定的Executor)。
正如您所提到的,它需要新的数据库事务方法。我们计划实施提交提款功能,因此应用程序可以在主数据库回滚后撤销JaVers的提交。见https://github.com/javers/javers/issues/588