首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用JaVers进行异步审计

用JaVers进行异步审计
EN

Stack Overflow用户
提问于 2017-10-12 03:31:49
回答 1查看 2.7K关注 0票数 3

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

以下是我的要求:

  • 异步日志记录-为了最小的性能影响
  • 将审计数据存储在不同的db性能原因中。

据我所见,JaVers并不是为上述目的而设计的,但似乎可以适应实现上述目标。下面是操作步骤:

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

代码语言:javascript
复制
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的自定义实现,它处理当前线程中的差异,然后将快照对象传递到另一个线程中。这样,我们只会在应用程序线程中读取DB,在审计线程中进行写入(这通常是代价更高的性能方面)。

问题:

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

只是FYI:与问题无关,但以下是我能想到的一些其他挑战,以及我计划如何解决这些挑战:

  • 由于没有在同一事务中执行审计,就好像事务失败一样,这会使审计回滚变得复杂。因此,我们只需要审核成功提交的对象。我打算使用Hibernate阻断器,监听afterTransactionCompletion,并且只提交由该事务更新的对象。
  • 对于延迟加载的对象,我可以看到,如果我们试图在事务完成后访问这些对象,可能是延迟加载的道具无法被访问(因为会话也可能被关闭)--不知道如何解决这个问题,但这可能不是一个问题,因为我认为我们正在加载急切的大多数道具。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-13 17:31:18

有趣的问题。首先是戴门蒂。所有JaVers核心模块的设计都是为了将审计数据与应用程序数据分离开来。正如您所提到的,用户提供了一个ConnectionProvider供JaVers使用。可能是你想要的任何数据库。

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

关于异步提交的不足,您是正确的。幸运的是,它只能在JaversCore中实现,而不需要更改存储库。

API可以是:

代码语言:javascript
复制
CompletableFuture<Commit> javers.commitAsync(..., Executor);

首先,Javer将对用户的对象进行快照,它非常快速,因此可以在当前线程中完成。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46700959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档