Коллекция Hibernate не обновляется, когда записи вставляются извне - PullRequest
2 голосов
/ 25 мая 2011

У меня есть сопоставленная коллекция, которая не обновляется при внешнем добавлении элементов в эту коллекцию в другом приложении.

Кэширование второго уровня отключено.

Пример ...

session = HibernateDataSource.openSession();
User dao = (User) session.load(User.class, 2434152);
// No items now, this gives 0
System.err.println(dao.getItems().size());
session.close();
Thread.sleep(10000);
// Add an item outside, e.g. in PMA
session = HibernateDataSource.openSession();
HibernateDataSource.getSessionFactory().evict(User.class);
HibernateDataSource.getSessionFactory().evict(UserItem.class);
HibernateDataSource.getSessionFactory().evictCollection(User.class.getName() + ".items");
dao = (User) session.load(User.class, 2434152);
// Still zero
System.err.println(dao.getItems().size());
session.close();

Я пробовал несколько решений при поиске в Google, например, установил, что коллекция грязная.Ничего не сработало.

Есть что-то еще, на что я не смотрел?

PS Сначала попробовал на Hibernate 3.2.7.Обновлен до 3.3.2, без разницы.

1 Ответ

1 голос
/ 26 мая 2011

Потратив 95% времени на взлом Hibernate, он был реабилитирован.

Проблема возникла из-за кэширования запросов MySQL, которое, несмотря на название, также кэширует наборы результатов для повторяющихся операций чтения.Это связано с характером мультитервинга в InnoDB MySQL.

Чтобы «установить новый момент времени для моментального снимка», оберните свою единицу работы в транзакцию, даже если есть только запросы select.

Дополнительная литература ...

http://forums.mysql.com/read.php?39,416790,416790

http://dev.mysql.com/doc/refman/5.0/en/query-cache.html

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