gpt4 book ai didi

java - 使用 JaVers 进行异步审核

转载 作者:行者123 更新时间:2023-11-30 06:28:03 25 4
gpt4 key购买 nike

我需要审核应用程序中某些实体的更改,并正在考虑使用 JaVers。我喜欢 JaVers 提供的对查询审计数据的支持。 Hibernate Envers 看起来不错,但它将数据存储在同一个数据库中。

这是我的要求:

  • 异步日志记录 - 将性能影响降到最低
  • 将审计数据存储在不同的数据库中 - 也是出于性能原因

据我所知,JaVers 并不是为上述目的而设计的,但似乎可以进行调整以实现上述目的。方法如下:

  • JaVers 实际上允许数据存储在不同的数据库中。您确实可以提供与任何数据库的连接。这不是它的初衷,但它确实有效。下面的代码(注意connectionProvider可以提供到任何数据库的连接):

'

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 提交的执行移动到线程/执行器中来实现异步。这样做的挑战是,如果执行时间太长,对象可能在记录之前就发生了变化。我在这里可以想到两种解决方案:
    • 我们可以创建对象的快照(例如将其序列化为 JSON 等)并将其传递给线程来记录它。
    • 我们提供 Javers Repository 的自定义实现,它处理当前线程中的差异,然后传递要在另一个线程中持久保存的 Snapshot 对象。这样我们就只能在应用程序线程中从数据库中读取数据,并在审核线程中进行写入(这通常会导致性能成本更高)。

问题:

  • 我在这里遗漏了什么吗?这可行吗?
  • JaVers 是否支持创建对象的快照,然后可以将其移动到另一个线程。它在内部某个地方执行此操作,所以也许我们可以使用它。

仅供引用:与该问题无关,但以下是我能想到的其他一些挑战以及我计划如何解决它们:

  • 由于不在同一个事务中进行审计,如果事务失败,会使审计回滚变得复杂。因此我们只需要审核成功提交的对象。我打算通过使用 Hibernate 拦截器、监听 afterTransactionCompletion 并仅提交由该事务更新的对象来实现此目的。
  • 对于延迟加载的对象,我可以看到,如果我们在事务完成后尝试访问它们,则可能无法访问延迟加载的 Prop (因为 session 也可能关闭) ) - 不知道如何解决这个问题,但这可能不是问题,因为我认为我们正在加载最急切的 Prop 。

最佳答案

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

用于 SQL 的 Spring 集成模块不适合与多个数据库一起使用,因此 javers-spring-jpajavers-spring-boot-starter-sql。它们仅涵盖最常见的场景,因此应用程序和 JaVers 的数据库相同。

关于缺乏异步提交,你是对的。幸运的是,它只能在 JaversCore 中实现,而无需更改存储库。

API 可以是:

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

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

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

正如您所提到的,它需要新的数据库事务方法。我们计划实现提交撤回功能,以便应用程序能够在主数据库回滚后撤回 JaVers 的提交。请参阅https://github.com/javers/javers/issues/588

关于java - 使用 JaVers 进行异步审核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46700959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com