forRevisionsOfEntity медленно - PullRequest
       10

forRevisionsOfEntity медленно

2 голосов
/ 23 февраля 2011

Я делаю запрос для всех ревизий класса, которые больше, чем отметка времени, используя:

AuditReaderFactory
    .get(emf.createEntityManager())
    .createQuery().forRevisionsOfEntity(clazz, false, true)
    .add(AuditEntity.revisionProperty("timestamp").gt(existingIndex.lastModified()))
    .getResultList();

Это воссоздает объект @ManyToOne, на который есть ссылка, используя запрос:

select <audit cols for this type> 
from <audit table> 
where DTYPE IN (<class type>) 
and REV=(
   SELECT max(REV) 
   FROM <audit table> 
   where TYPE IN (<class type>) 
   and REV <= <maximum revision in revision entity table> 
   and <subquery>.id=<query>.id
) 
and REVTYPE<>2 
AND <audit table>.id=<id of entity being restored>

Этот запрос невероятно медленный и занимает более 100 минут только для одного объекта (на самом деле, пока я пишу это, он все еще выполняется). Почему он получает последнюю ревизию сущности (минус DEL ревизии)? Гораздо быстрее использовать ORDER BY REV LIMIT 1 (или аналогичный для баз данных, у которых нет LIMIT). Я почти хочу просто перейти на SQL, поскольку это слишком медленно. Это также можно ускорить, используя идентификатор прямо внутри подзапроса вместо ссылки на идентификатор таблицы запроса. У меня есть индексы DTYPE, REV и REVTYPE и уникальный ключ для идентификатора REV, так что это не проблема с индексированием.

Я не уверен, почему он использует приведенный выше запрос для воссоздания ссылочного объекта, и был бы признателен за любую информацию. Это в базе данных MySQL 5.1 на компьютере с процессором Pentium 4, но на двухъядерном компьютере это также занимает значительное время.

1 Ответ

1 голос
/ 02 июня 2011

Производительность была значительно улучшена в версии 3.6.0 hibernate.Что вы должны сделать, это использовать ValidityAuditStrategy.Добавьте это в ваш файл persistence.xml:

    <property name="org.hibernate.envers.audit_strategy"
              value="org.hibernate.envers.strategy.ValidityAuditStrategy"/>

Это добавит столбец REVEND в вашу проверяемую таблицу, поэтому внутренние выборки не требуются.Подробнее здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...