Hibernate Envers中查询的性能

时间:2012-11-07 14:27:18

标签: java hibernate 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 有没有办法优化查询,例如一次获得多种实体?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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

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

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