代码之家  ›  专栏  ›  技术社区  ›  honor

Spring应用程序中的休眠环境性能和事务管理

  •  0
  • honor  · 技术社区  · 6 年前

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

    1-性能-线程:

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

    2-性能-缓存和执行:

    envers是否缓存了所有的审计处理并在稍后执行?我是说在所有的录音都完成之后。

    3-交易管理:

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

    4-分布式事务管理:

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

    使用enver时遇到的问题是什么(如果有的话)。您采用了哪些备选审计方法?

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

    谢谢!

    1 回复  |  直到 6 年前
        1
  •  0
  •   Naros    6 年前

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

    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之间的集成无关。