使用 JaVers 进行异步审计

Async auditing with JaVers

我需要审核对我们应用程序中某些实体的更改,并且正在考虑使用 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();

问题:

仅供参考:与问题无关,但这里有一些我能想到的其他挑战以及我打算如何解决它们:

有趣的问题。 首先是德门蒂人。所有 JaVers 核心模块都旨在将审计数据与应用程序数据分离。正如您提到的,用户提供了一个供 JaVers 使用的 ConnectionProvider。它可以是您想要的任何数据库。

SQL 的 Spring 集成模块并非设计用于多个数据库,因此 javers-spring-jpajavers-spring-boot-starter-sql。它们只涵盖最常见的场景,因此应用程序和 JaVers 的数据库相同。

关于缺少异步提交,你是对的。幸运的是,它可以只在 JaversCore 中实现,而无需更改 Repositories。

API 可能是:

CompletableFuture<Commit> javers.commitAsync(..., Executor);

首先,Javers 会对用户的对象进行快照,速度很快,因此可以在当前线程中完成。

然后,数据库读取(加载最新快照)和数据库写入(插入新快照)可以异步完成(提交给给定的执行器)。

正如您所提到的,它需要新的数据库事务处理方法。我们计划实现 Commit Withdrawal 功能,这样应用程序就可以在主数据库回滚后撤回 JaVers 的提交。参见 https://github.com/javers/javers/issues/588