Будьте в спящем режиме 2-е кэширование Уровня, кажется, не работает

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

net.sf.ehcache.hibernate.SingletonEhCacheProvider

У меня есть кэш по умолчанию и класс, который определенный кэш включил в ecache.xml, на который ссылаются в моем файле hibernate.cfg.xml. Файл класса/отображения определенный кэш определяется для обработки до 20 000 объектов.

Однако я не вижу усилений perfrormance, так как я включил кэш, отображающийся на одном из отображающихся файлов, с которыми я тестирую это.

Мой тест следующие.

Загрузите 10 000 объектов конкретного файла отображения, который я тестирую (это должно поразить DB и быть горлышком бутылки). Затем я иду для загрузки тех же 10 000 объектов как эта точка, я ожидал бы, что кэш будет поражен и будет видеть значительное увеличение производительности. Попытались использовать и "только для чтения" и кэш "чтения-записи", отображающийся на быть в спящем режиме XML-файле отображения, с которым я тестирую.

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

Примечание как часть теста я - подкачка страниц через эти 10 000 записей с помощью чего-то подобного ниже (подкачка страниц 1000 записи во время).

Criteria crit = HibernateUtil.getSession() .createCriteria( persistentClass );
       crit.setFirstResult(startIndex);
       crit.setFetchSize(fetchSize);
       return crit.list();

Видели, что критерии имеют кэширующийся метод set режима ( setCacheMode() ) так есть ли что-то, что я должен делать с этим??

Я замечаю использование ниже кода статистики, что существует 10 000 объектов (хорошо в спящем режиме обезвоженный onjects, который я воображаю??) в памяти, но по некоторым причинам я получаю 0 хитов и более тревожные 0 промахов, таким образом, похоже на не движение к кэшу вообще, когда его выполнение взгляда даже при том, что код статистики, кажется, говорит мне, что существует 10 000 объектов в памяти.

Какие-либо идеи о том, что я делаю неправильно? Я беру его факт, который я получаю, промахи хорошо, поскольку это означает, что кэш используется, но я не могу выяснить, почему я не получаю удачных обращений в кэш. Снижается на это к факту, который я использую setFirstResult() и setFetchSize() с критериями.

System.out.println("Cache Misses = " + stats.getSecondLevelCacheMissCount());
System.out.println("Cache Hits Count = " + stats.getSecondLevelCacheHitCount());

System.out.println("2nd level elements in mem "+ stats.getSecondLevelCacheStatistics("com.SomeTestEntity").getElementCountInMemory());
6
задан Pascal Thivent 29 June 2010 в 23:35
поделиться

1 ответ

Кэш второго уровня работает для «поиска по первичному ключу». Для других запросов вам необходимо кэшировать запрос (при условии, что кеш запроса включен), в вашем случае с использованием Criteria # setCacheable (boolean) :

Criteria crit = HibernateUtil.getSession().createCriteria( persistentClass );
crit.setFirstResult(startIndex);
crit.setFetchSize(fetchSize);
crit.setCachable(true); // Enable caching of this query result
return crit.list();

Я предлагаю прочитать:


Если я кэширую запрос, все ли они переведены в спящий режим из запроса, а затем доступны в кэше второго уровня?

Да, будут. Это объясняется черным по белому в упомянутой мной ссылке: «Обратите внимание, что кеш запроса не кэширует состояние фактических сущностей в наборе результатов; он кэширует только значения идентификаторов и результаты типа значения. Таким образом, кеш запроса всегда следует использовать вместе с кешем второго уровня ». Вы его читали?

Поскольку у меня сложилось впечатление, что использование кеша запросов полностью отличается от использования кеша 2-го уровня гибернации.

Это другое («ключ», используемый для входа (ов) кэша, другой). Но кеши запросов полагаются на кеш L2.

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

Я просто говорю, что вам нужно кэшировать запрос, поскольку вы не «ищите по первичному ключу». Я не понимаю, что непонятно. Вы пытались вызвать setCacheable (true) для объекта запроса или критериев? Извините за настойчивость, но вы читали ссылку, которую я опубликовал?

13
ответ дан 8 December 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: