Проблемы с кешем второго уровня в спящем режиме - PullRequest
3 голосов
/ 25 марта 2011

У меня отношение много к одному, скажем, у пользователя есть компания. Предприятие не имеет иных отношений.

Если я включаю кэш второго уровня для запроса findAll Hibernate компании, во второй раз, когда я перезагружаю страницу (что означает, что пользователь загружен, а затем также загружен список всех компаний), я получаю выбор для каждой существующей компании (выберите из компании, где id =?) в спящем режиме. Это происходит при вызове findAll для Company, это выглядит так (это универсальный метод в классе, который расширен соответствующим типом):

return (List<T>) getHibernateTemplate().execute(new HibernateCallback() {

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Criteria c = session.createCriteria(persistentClass);
                c.setCacheable(cacheFindAll);

                return c.list();
            }
        });

Я использую Jboss TreeCacheProvider в стратегии только для чтения. Если я использую setCacheable(false), то нет никаких «нежелательных» выборов.

Почему это происходит и как я могу устранить это поведение?

1 Ответ

6 голосов
/ 25 марта 2011

Вызов setCacheable () предназначен для включения кэша запросов , см. javadoc :

Enable caching of this query result, provided query caching is enabled for the underlying session

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

Чтобы включить кеш второго уровня, вам нужно установить hibernate.cache.use_second_level_cache = true в persistence.xml,Кроме того, вам нужно аннотировать ваши отношения и сущности, которые вы хотите кэшировать, в кэше второго уровня.

@OneToMany
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
private List<Company> companies;

И кэширование сущностей:

@Entity
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class Company {
    ...
}

Кстати, кэш второго уровня будет толькокэшируйте отношения и сущности, которые вы найдете по id.Запросы не могут быть кэшированы кешем второго уровня и всегда будут отправляться в базу данных (или кеш запросов).

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