Spring应用程序中的Hibernate Envers性能和事务管理

Spring应用程序中的Hibernate Envers性能和事务管理,hibernate,hibernate-envers,Hibernate,Hibernate Envers,在我们的SpringBoot项目(使用SpringMVC、SpringData等)中,我们使用HibernateEnvers来审核数据库记录。 有几件事我不确定 1-性能-线程: 假设我有一个被审计的个人实体。当我在相关表中插入/更新新的个人记录时,这会如何影响我的应用程序的性能?客户端是否必须等待所有envers审核完成?Envers会在一个单独的线程中处理这个问题吗?一旦插入成功,那么客户就可以继续他一直在做的任何任务了?或者所有审计都将在一个线程中处理,客户端应用程序将不得不等待所有审计记

在我们的SpringBoot项目(使用SpringMVC、SpringData等)中,我们使用HibernateEnvers来审核数据库记录。 有几件事我不确定

1-性能-线程:

假设我有一个被审计的个人实体。当我在相关表中插入/更新新的个人记录时,这会如何影响我的应用程序的性能?客户端是否必须等待所有envers审核完成?Envers会在一个单独的线程中处理这个问题吗?一旦插入成功,那么客户就可以继续他一直在做的任何任务了?或者所有审计都将在一个线程中处理,客户端应用程序将不得不等待所有审计记录完成

2-性能-缓存和do:

Envers是否缓存所有审核处理并在以后执行?我的意思是在所有的录音完成之后

3-交易管理:

交易管理怎么样。假设我已成功为Person实体创建了一个记录,但在尝试创建审核记录时出错。那么会发生什么?这会回滚Person实体数据的记录吗

4-分布式事务管理:

分布式事务环境怎么样?如何确保分布式事务环境中envers审计记录的一致性?你有没有遇到过类似的情况?如果有问题,你是如何解决的

您在使用Envers时遇到了哪些问题(如果有)。您采用的其他审计方法有哪些

请不要只是提供链接和说“读这个”。告诉我你知道什么,你经历过什么

非常感谢

当我在相关表格中插入/更新时,这会如何影响我的应用程序的性能

Hibernate有两种高级操作模式:有状态和无状态

当Hibernate在有状态(例如,
会话
无状态会话
)模式下运行时,它总是将实体操作收集到操作队列中。此操作队列稍后用于驱动事件系统,该事件系统不仅使Hibernate为这些操作执行SQL,而且还将这些实体操作通知集成商

行动队列有许多目标。但在性能方面,它允许Hibernate收集这些操作并延迟数据库操作,这样可以最大限度地减少连接获取和使用,从而可以批量执行数据库操作

客户端是否必须等待所有envers审核完成?
Envers在一个单独的线程中处理这个问题

是的,当Envers与您的
会话运行在同一线程边界时,客户端必须等待

一旦插入成功,那么客户就可以继续他一直在做的任何任务了?或者所有审计都将在一个线程中处理,客户端应用程序将不得不等待所有审计记录完成

Envers和Hibernate一样维护一个类似的操作队列。当Hibernate刷新其操作队列并触发事件时,Envers将收到这些事件的通知,并建立自己的操作队列

Envers的操作队列和Hibernate的主要区别在于,由于Envers是一个提交时审计框架,其操作队列无法手动刷新。审核操作队列将在事务提交之前立即自动刷新,以确保来自Hibernate的所有事务操作都已首先发送到数据库

所以是的,它都是单线程的

Envers是否缓存所有审核处理并在以后执行?我的意思是在所有的录音完成之后

是的,正如我上面所描述的,但我将在这里说明。假设我们在客户端中有一个打开的会话和一个活动的事务:

// User code calls save on some entity objects
// after these operations, some action queue entries are generated 
// No SQL has been executed
// No Audit operations have been executed or generated
session.save( someEntity1 );
session.save( someEntity2 );

// Lets say we manually flush Hibernate
// This flushes the Hibernate action queue
// SQL statements get fired for the above 2 saves
// Events are fired for integrators for the 2 save operations
// Envers generates AuditWorkUnit entries in its action queue for the operations
session.flush();

// User code calls save on another entity
// after these operations, some action queue entries are generated
// No SQL has been executed for this
// No Audit operations have been executed or generated
session.save( someEntity3 );

// commit the transaction
// This flueshes the Hibernate action queue
// sQL statements get fired for the above save of someEntity3
// Events are fired for integrators for the 1 save operation
// Envers generates AuditWorkUnit entries in its action queue for the operation
// pre-commit operations fire:
//   * Envers iterates its AuditWorkUnit action queue and executes those
//   * This generates Audit table SQL operations
// Transaction gets committed if no errors
session.getTransaction().commit();
交易管理怎么样。假设我已成功为Person实体创建了一个记录,但在尝试创建审核记录时出错。那么会发生什么?这会回滚Person实体数据的记录吗

事务将被标记为回滚;因此,不会在审核模式中为
人员
或其对应的审核保存任何数据

分布式事务环境怎么样?如何确保分布式事务环境中envers审计记录的一致性?你有没有遇到过类似的情况?如果有问题,你是如何解决的

这不适用;让我解释一下

恩维尔斯本身是超级简单化的。我前面提到的那些事件导致生成一系列HQL语句并将其交给Hibernate执行;没什么特别的

这意味着在客户端用户代码中与您交互以将操作发送到Hibernate的
会话
事务
与Envers交互以执行完全相同的操作相同

因此,无论出于何种原因,如果分布式事务被标记为回滚,那么不仅您的
Person
数据被回滚,Envers操作本身也是如此。事务是否分布式与Hibernate和Envers之间的集成无关

当我在相关表格中插入/更新时,这会如何影响我的应用程序的性能

Hibernate有两种高级操作模式:有状态和无状态

当Hibernate在有状态(例如,
会话
无状态会话
)模式下运行时,它总是将实体操作收集到操作队列中。此操作队列稍后用于驱动一个事件系统,该事件系统