我们目前正在项目中使用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 有没有办法优化查询,例如一次获得多种实体?
答案 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 通过这种方式,您可以获得在修订版中更改的实体的名称,但我不确定您对流的要求是什么 - 您需要返回给最终用户。
否则,我认为你必须在一个单独的实体中实现一些自定义修改/存储必要的“流”数据。