2013-03-01 2 views
0

Мы позволили кэша второго уровня на спящем режиме, используя следующие свойства:Hibernate кэша второго уровня ленивая коллекция размер

hibernateProperties.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory"); 
hibernateProperties.setProperty("hibernate.cache.use_query_cache", Boolean.TRUE.toString()); 
hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", Boolean.TRUE.toString()); 
hibernateProperties.setProperty("hibernate.cache.use_structured_entries", Boolean.TRUE.toString());  
hibernateProperties.setProperty("hibernate.cache.generate_statistics", Boolean.TRUE.toString()); 

И помечены наши объекты с помощью тега кэша:

@Entity 
@Indexed 
@Table(name = "item") 
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL) 
public class Item implements Serializable { 

Этой сущность имеет ленивую коллекцию с опцией ленивого сбора:

@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL) 
@ManyToMany(fetch = FetchType.LAZY, targetEntity = User.class, mappedBy = "likes") 
@LazyCollection(LazyCollectionOption.EXTRA) 
private List<User> users; 

Это похоже на работает хорошо, и я не вижу каких-либо запросов к базе данных после того, как данные в кэше, но то, что мы видим, являются журнал вызовов

select count(user_id) from user_items where item_id =? 

Есть ли способ получить спящий режим кэшировать размеров ленивая коллекция, поэтому не нужно ударять по базе данных, когда мы делаем users.size()?


Я изменил к CacheConcurrencyStrategy.READ_WRITE и увидеть такое же поведение.

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

В последующих запросах нет вызовов для загрузки объектов, но есть еще вызовы для поиска размеров коллекций.

ответ

0

Вы никогда не увидите запрос базы данных при кешировании данных. и вы говорите, что существуют непрерывные журналы избранных запросов. Ehcache не предоставляет кэш транзакций. И вы говорите, что это работа. Брат не работает, у вас просто есть вызовы базы данных и журналы того же самого. Проверьте Ehcache документацию, он не поддерживает TRANSACTIONAL кэширования

+0

«Документация Ehcache, так как она не поддерживает транзакционное кэширование» - что это значит, что вы думаете о транзакционном кеше? – NimChimpsky

+0

Я изменил на CacheConcurrencyStrategy.READ_WRITE и вижу то же поведение. В первом запросе я вижу запросы для выбора сущностей и запросов, чтобы найти размер коллекций. Я вижу сообщения журнала о том, что объекты кэшируются. В последующих запросах нет вызовов для загрузки сущностей, но есть еще вызовы для поиска размеров коллекций. – Chris

0

Список пользователей ленивые загружены коллекции. В Lazy загруженной коллекции у вас не будет никаких данных. Всякий раз, когда вы хотите получить доступ к коллекции Lazy, или вы хотите определить размер ленивой загруженной коллекции, она должна иметь информацию о данных внутри нее, например, сколько элементов есть. Для этого он получит эти данные из базы данных и поэтому будет генерировать запросы к базе данных каждый раз. Я проверил список как на верхнем уровне, так и внутри некоторых других объектов. Что показывает, что когда List не является объектом верхнего уровня, он будет лениво инициализирован. Поэтому всякий раз, когда вы хотели бы получить информацию о коллекции или из коллекции, она будет генерировать запросы к базе данных.

Смежные вопросы