2

我们目前在一个项目中使用 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());    
} 

除此之外,某些类型的实体(如嵌套实体)需要一些额外的审计信息。

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

Q1我想知道是否可以对这类查询启用批量获取以及如何启用?

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

4

2 回答 2

2

一个 Audition 是多个表中更改的集合!

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

Q1:并非所有依赖表的更改都取决于您的 Entity-Audition,Batch-Fetch 不能在这里工作。

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

于 2012-11-07T14:53:54.680 回答
1

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

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

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

于 2012-11-08T08:57:04.603 回答