繁体   English   中英

Hibernate Envers中查询的性能

[英]Performance of queries in Hibernate Envers

我们目前正在项目中使用Envers,当我们查询围绕多个表传播的一些审计数据时,性能会下降很多。

基本上我们创建一个审计数据流如下:

List<Object[]> auditStream = new LinkedList<Object[]>();
for (Class<?> entityClass : desiredEntityClasses) {
    auditStream.addAll(
        auditReader.createQuery()
            .forRevisionsOfEntity(entityClass, false, true)
            .add(AuditEntity
                .revisionProperty("timestamp")
                .ge(startTimestamp))
            .getResultList());    
} 

最重要的是,某些类型的实体(如嵌套实体)需要一些额外的审计信息。

对于少量数据(通过减少时间戳),响应时间是合理的,但是在auditStream有500个条目,它需要大约3秒来完成,这太长了。

Q1我想知道是否有可能打开这些查询的批量获取以及如何?

Q2是否有某种方法可以优化查询,例如一次获得多种实体?

One Audition是多个表中的一组变化!

如果使用REVID引用的修订表(REVINFO),则将检查所有其他表以查找此REVID的匹配更改。

Q1:并非所有依赖表的更改都取决于您的Entity-Audition,Batch-Fetch无法在此处工作。

Q2:您最好通过HQL或纯SQL直接获取更改。

要有效地实现这一点,您需要有关在单个表中修订中所做的所有更改的信息 - 现在您要查询多个更改。

从Envers方面来说,也许这会有所帮助: http ://docs.jboss.org/hibernate/core/4.0/devguide/en-US/html/ch15.html#envers-tracking-modified-entities-revchanges这样你可以获取在修订版中更改的实体的名称,但我不确定您对该流的要求是什么 - 您需要返回给最终用户。

否则,我认为你必须在一个单独的实体中实现一些自定义修改/存储必要的“流”数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM