【问题标题】:Is there a way to capture all hibernate changes made, grouped by transaction?有没有办法捕获所有的休眠更改,按事务分组?
【发布时间】:2019-10-23 18:47:17
【问题描述】:

我知道我可以创建 Pre/Post Insert/Update/Delete 侦听器,并且我可以记录这些事件,但鉴于来自多个线程的多个事务可以同时运行,我不确定如何进行分组他们一起或确定我已经完成了所有的捕获。

我也知道我可以监听事务何时完成,但由于上述问题,我不确定如何识别该事务中包含哪些更改。

如果有帮助,我已经在使用 envers 来创建审核并使用自定义修订类来向 REVINFO 记录添加字段。

是否有我缺少的休眠机制可以帮助解决这个问题?

编辑:

我实际上想要做的事情:事务完成后(希望由 spring/hibernate/envers 触发),遍历所做的所有修改(我认为 envers 可以通过它的事件提供这个,我很高兴记录这些地方由事务 ID 键入),然后写一个对 SQS 所做更改的摘要。

【问题讨论】:

  • 它有点宽泛。你想存储什么?您可以使用绑定到当前执行线程的ThreadLocal 来基于每个线程存储数据。 baeldung.com/java-threadlocal。如果这是 webapp,请确保您已将 ThreadLocal 上下文清除为请求生命周期中的某个合适点,因为服务器可能会重用池中的线程。
  • 这绝对是一个选择。我想我希望的是,如果 envers 可以写入 100 条审计记录并将它们分组到单个 REV,我是否可以在插入/更新/删除侦听器中捕获该 REV?
  • 我更新了这个问题,详细说明了我想要实现的目标。
  • 事件监听器拥有对象的新旧状态。制作差异应该很容易做到。但是既然你已经在使用 envers 为什么不使用它呢?或者使用 JaVers 之类的东西为新旧版本创建差异。
  • 我已经想了一晚上,我想我太专注于让 spring/hibernate 为我将更改分组到事务中(或提供事务 ID)。我认为最好将事件更改流式传输到某处并创建我自己的批处理/分组。

标签: spring hibernate spring-transactions hibernate-envers


【解决方案1】:

鉴于您使用的是 Envers,我实际上会考虑将报告生成步骤与当前应用程序完全分离。这给您带来了几个优势:

  • Hibernate 事务不会涉及任何不必要的步骤,因此它们的提交速度更快。
  • 关注点分离,您的报告生成完全独立。
  • 使用轮询/推送机制,重试逻辑变得简单。

当然,您可以将这一切归为一类,但我相信管理这些要点变得更加困难,但最终决定权在您手中。

在下面的解释中,我将假设轮询/推送是在单独的应用程序中完成的。这个想法是这个单独的应用程序包含应用程序实体映射(或至少是感兴趣的)。

首先,我建议REVINFO 的修订实体映射也跟踪修改后的实体类型。这将在以后生成报告时非常有用,因为我们可以将实体类型与修订号结合起来,并根据它获取修订。

其次,单独的应用程序旨在跟踪最后处理的修订号。每次应用程序的轮询/推送序列触发时,应用程序都会查看是否有任何新的修订,如果有,它会处理它们;否则它将等待然后再次轮询。

这个概念的总体思路是:

  1. 获取自上次修订号以来的所有修订实体实例
  2. 迭代每个修订实体并...
    • 对于修订中修改的每个实体类型,按修订实体修订号获取更改
    • 对于修订版中修改的每个实体类型,获取之前的修订版
    • 执行两个 java 实例的差异(使用 JaVers 等)
  3. 记录所有差异后,将报告发送给 SQS

【讨论】:

    猜你喜欢
    • 2014-08-25
    • 2019-04-30
    • 1970-01-01
    • 2011-04-12
    • 2010-10-12
    • 1970-01-01
    • 2010-11-24
    • 2010-09-13
    • 2010-10-07
    相关资源
    最近更新 更多