В настоящее время я пытаюсь заставить работать спящий режим с помощью поставщика кэширования, который поставляется с hibernate.
net.sf.ehcache.hibernate.SingletonEhCacheProvider
У меня есть кеш по умолчанию и кеш для конкретного класса, включенный в ecache.xml, на который есть ссылка в моем файле hibernate.cfg.xml. Кэш, относящийся к классу / файлу отображения, определен для обработки до 20000 объектов.
Однако я не вижу увеличения производительности, так как я включил отображение кэша в одном из файлов сопоставления, с которым я тестирую это.
Мой тест выглядит следующим образом.
Загрузите 10000 объектов конкретного файла сопоставления, который я тестирую (это должно ударить по БД и стать бутылочным горлышком).
Затем я собираюсь загрузить те же 10000 объектов, поскольку в этот момент я ожидаю, что кэш будет поражен и увидит значительный прирост производительности. Попытался использовать сопоставление кэша «только для чтения» и «чтение и запись» в XML-файле hibernate mapping, с которым я тестирую.
Мне интересно, нужно ли им что-то делать, чтобы убедиться, что кэш загружается перед БД при загрузке объектов?
Обратите внимание, что в рамках теста я пролистываю эти 10000 записей, используя что-то похожее на приведенное ниже (подкачка 1000 записей за раз).
Criteria crit = HibernateUtil.getSession() .createCriteria( persistentClass );
crit.setFirstResult(startIndex);
crit.setFetchSize(fetchSize);
return crit.list();
Видели, что у критериев есть установщик режима кэширования (setCacheMode()
), так что я должен делать с этим ??
Я замечаю, используя приведенный ниже код статистики, что в памяти есть 10000 объектов (хорошо, я думаю, обезвоженные объекты), но
по какой-то причине я получаю 0 хитов и более тревожно 0 промахов, так что похоже, что он вообще не попадает в кэш, когда выполняет поиск, даже несмотря на то, что код статистики говорит мне, что в памяти 10000 объектов.
Есть идеи, чем я занимаюсь? Я полагаю, тот факт, что я получаю промахи, хорош, так как это означает, что кеш используется, но я не могу понять, почему я не получаю никаких попаданий в кеш. Это до того, что я использую 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());