Я несколько дней бился головой о стену с этой проблемой.
Мы пытаемся реализовать кэш второго уровня Hibernate, используя Infinispan. Приложение работает на JBoss AS 6 и использует транзакции JTA.
В нашем файле persistence.xml у нас есть:
...
<!-- JTA configurations -->
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />
<property name="current_session_context_class" value="jta" />
<!-- Infinispan configurations -->
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.infinispan.InfinispanRegionFactory"/>
<property name="hibernate.cache.infinispan.cachemanager" value="java:CacheManager/entity"/>
...
как определено здесь:< /а>
Насколько мы понимаем, это тот вид кеша, который нам нужен для того, чтобы сделать следующее:
Первый вариант использования: у нас есть записи в базе данных, которые будут содержать справочные данные. Эти данные не будут изменяться в течение длительного периода времени (мы надеемся :) ).
Мы хотим кэшировать эти записи, так как они, вероятно, будут часто запрашиваться. И когда пользователи запрашивают эти данные, им не нужно будет обращаться к БД, так как они должны кэшироваться.
В данном случае это кеш запроса типа кеша или кеш сущностей? Поскольку запрос всегда один и тот же, я понимаю, что кеш запросов, поскольку запрос que, должен всегда возвращать одни и те же результаты.
Мой запрос:
List<MyEntity> list = session.createCriteria(MyEntity.class)
.add(Restrictions.eq("id", 1))
.setCacheable(true)
.list();
Сценарий 2. Пользователь получает определенную запись из БД и может ее обновить. Мы хотели бы, чтобы эта сущность (или список сущностей) сохранялась в кэше сеанса пользователя (сеанса входа), поэтому, если он обновит эту сущность на клиенте, нам не нужно будет делать выбор перед обновлением. В этом случае, поскольку мы сохраняем определенные сущности, это считается кэшированием сущностей, верно? Если мы хотим сохранить
Для этого мы используем:
@Cacheable (true)
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class MyEntity implements Serializable
{
...
}
Правильно ли я делаю эти предположения? Если нет, то какой здесь подход? Думаю, я делаю из этого большой беспорядок.