Я в настоящее время пытаюсь добраться, в спящем режиме, работая, используя кэширующегося поставщика, который идет, в спящем режиме.
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());
Кэш второго уровня работает для «поиска по первичному ключу». Для других запросов вам необходимо кэшировать запрос (при условии, что кеш запроса включен), в вашем случае с использованием 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)
для объекта запроса или критериев? Извините за настойчивость, но вы читали ссылку, которую я опубликовал?