当我在相关表中插入/更新时,这将如何影响我的应用程序的性能?
Hibernate有两种高级操作模式:有状态和无状态。
当休眠状态运行时(例如
Session
不
StatelessSession
)在模式下,它总是将实体操作收集到操作队列中。稍后将使用此操作队列来驱动事件系统,该系统不仅使Hiberant为这些操作执行SQL,还将通知集成器这些实体操作。
行动队列有许多目标。但在性能方面,它允许Hibernate收集这些操作,并延迟数据库操作,从而最小化连接获取和使用,从而使数据库操作可能批量执行。
客户是否必须等待所有环境审核完成?
envers在单独的线程中处理这个问题?
是的,客户端将不得不等待,因为enver与您的
会话
.
一旦插入成功,客户就可以继续执行他正在做的任何任务了?或者所有的审计都将在一个线程中处理,客户端应用程序将不得不等待所有的审计记录完成?
enver与hibernate维护类似的操作队列。当Hibernate刷新其操作队列并触发事件时,将通知enver这些事件并建立自己的操作队列。
enver的操作队列和hibernate的主要区别在于enver是一个提交时间审计框架,它的操作队列不能手动刷新。审核操作队列将在事务提交之前立即自动刷新,以确保来自休眠的所有事务操作都已首先发送到数据库。
所以是的,它都是单线程的。
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执行;在那里没有什么特别的。
意思是一样的
会议
和
Transaction
您在客户机的用户代码中与交互,以将操作发送到Hibernate,这与envers进行交互的目的完全相同。
因此,如果该分布式事务由于任何原因被标记为回滚,那么不仅是
人
数据回滚,envers操作本身也是。事务是否是分布式的与Hibernate和Enver之间的集成无关。