Hibernate在Spring应用程序中实现性能和事务管理

时间:2018-12-07 17:12:25

标签: hibernate hibernate-envers

在我们的SpringBoot项目(使用Spring MVC,Spring Data等)中,我们使用Hibernate Envers审计数据库记录。 有几件事我不确定。

1-性能-线程:

假设我有一个已审核的Person实体。当我在相关表中插入/更新新的“个人”记录时,这对我的应用程序的性能有何影响?客户是否需要等待所有的审核完成? Envers是否将在单独的线程中处理此问题?并且一旦插入成功,客户端将能够继续执行他正在执行的任何任务?还是将所有审核工作都在一个线程中处理,客户端应用程序将不得不等待所有审核记录完成?

2-性能-缓存并执行:

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

3-交易管理:

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

4-分布式事务管理:

分布式交易环境如何?您如何确保在分布式事务环境中审核记录的一致性?您是否遇到过类似情况?如何解决您的问题?

使用Envers时遇到了什么问题-如果有问题。您采用了哪些替代审核方法?

请不要仅提供链接并说“阅读本文”。告诉我你所知道的和所经历的。

非常感谢!

1 个答案:

答案 0 :(得分:1)

  

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

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

当Hibernate以有状态(例如Session而非StatelessSession)模式运行时,它总是将实体操作收集到一个动作队列中。稍后将使用该操作队列来驱动事件系统,该事件系统不仅使Hiberante对那些操作执行SQL,而且还将这些实体操作通知给集成商。

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

  

客户是否必须等待所有的审核结束?
  会在一个单独的线程中处理此问题?

是的,因为Envers在与您的Session相同的线程边界中运行,客户端将不得不等待。

  

插入成功后,客户端将能够继续执行他正在执行的任何任务?还是将所有审核工作都在一个线程中处理,客户端应用程序将不得不等待所有审核记录完成?

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实体数据的记录吗?

该交易将被标记为回滚;因此在审核架构中不会为Person或与之等效的审核保存任何数据。

  

分布式交易环境如何?您如何确保在分布式事务环境中审核记录的一致性?您是否遇到过类似情况?如何解决您的问题?

那不适用;让我解释一下。

Envers本身非常简单。我前面提到的那些事件导致生成了一系列HQL语句,并将其交给Hibernate执行。那里没什么特别的。

这与您在客户端的用户代码中进行交互以将操作发送到Hibernate的SessionTransaction相同,而Envers进行交互也完全相同。

因此,如果出于某种原因将该分布式事务标记为回滚,不仅Person数据也会回滚,Envers操作本身也会回滚。事务是否分散与Hibernate和Envers之间的集成无关。