Почему Hibernate обновляет UpdateTimestampsCache с каждым SQL-запросом

Я включил кэши второго уровня и запросов в моем приложении. Похоже, когда я вызываю следующий код

String sql = "update SOME_TABLE set SOME_FIELD=somevalue";
SQLQuery query = getSession().createSQLQuery(sql);
query.executeUpdate();

hibernate обновляет таблицы UpdateTimestampsCache для ВСЕХ. Почему он это делает? У меня около 1000 таблиц и много запросов sql в моем приложении. Мне не нужны эти обновления, потому что я не обновляю кэшированные таблицы через sql. Это приводит к огромному сетевому трафику и приостановке приложения.

Есть ли способ сообщить hibernate НЕ делать какие-либо обновления при запуске sql-запросов?

2 ответа

Я нашел решение!

Вы можете использовать метод addSynchronizedEntityClass()

String sql = "update SOME_TABLE set SOME_FIELD=somevalue";
SQLQuery query = getSession().createSQLQuery(sql);
query.addSynchronizedEntityClass(SomeTable.class)
query.executeUpdate();

В этом случае он сбросит только кеш для SOME_TABLE


Вы можете попробовать использовать StatelessSession вместо обычного сеанса. Вы также можете использовать прямой JDBC вместо метода createSQLQuery для спящего режима.

Другой вариант - использовать запрос обновления HQL вместо SQL. Это может помочь выяснить, какой объект вы обновляете, и только аннулировать результаты запроса для этого запроса. Когда вы запускаете спящий запрос SQL-запроса, не знаете, какая таблица обновляется, поэтому, чтобы быть на более безопасной стороне, он помечает все результаты кэша запросов как недействительные.

licensed under cc by-sa 3.0 with attribution.