Использование Hibernate 4.3.11 и Ehcache 2.7.0
Почему хиты / пропуски, возвращаемые Hibernates, getStatistics () не соответствуют значениям, возвращаемым CacheManager. Я включил кэширование 2-го уровня для одного класса.
То есть с этим кодом
Statistics stats = HibernateUtil.getFactory().getStatistics();
writeToBothLogs("Report:" + currentReportId + ":DbConnect:" + stats.getConnectCount());
writeToBothLogs("Report:" + currentReportId + ":DbQueries:" + stats.getQueryExecutionCount());
writeToBothLogs("Report:" + currentReportId + ":2ndLevelPut:" + stats.getSecondLevelCachePutCount());
writeToBothLogs("Report:" + currentReportId + ":2ndLevelHit:" + stats.getSecondLevelCacheHitCount());
writeToBothLogs("Report:" + currentReportId + ":2ndLevelMiss:" + stats.getSecondLevelCacheMissCount());
String[] cacheNames = CacheManager.getInstance().getCacheNames();
for(String cacheName:cacheNames)
{
SecondLevelCacheStatistics secondLeveleStats = stats.getSecondLevelCacheStatistics(cacheName);
writeToBothLogs("Report:" + currentReportId + ":"+cacheName+":2ndLevelPut:" + secondLeveleStats.getPutCount());
writeToBothLogs("Report:" + currentReportId + ":"+cacheName+":2ndLevelHit:" + secondLeveleStats.getHitCount());
writeToBothLogs("Report:" + currentReportId + ":"+cacheName+":2ndLevelMiss:" + secondLeveleStats.getMissCount());
writeToBothLogs("Report:" + currentReportId + ":"+cacheName+":2ndLevelSizeInMemory:" + secondLeveleStats.getSizeInMemory());
Cache cache = CacheManager.getInstance().getCache(cacheName);
writeToBothLogs("CacheName:"+cacheName
+":Put:"+cache.getStatistics().cachePutCount()
+":Hit:"+cache.getStatistics().cacheHitCount()
+":Miss:"+cache.getStatistics().cacheMissCount()
+":Size:"+cache.getSize()
);
}
writeToBothLogs("Report:" + currentReportId + ":DeleteCount:" + stats.getEntityDeleteCount());
writeToBothLogs("Report:" + currentReportId + ":InsertCount:" + stats.getEntityInsertCount());
writeToBothLogs("Report:" + currentReportId + ":FetchCount:" + stats.getEntityFetchCount());
writeToBothLogs("Report:" + currentReportId + ":UpdateCount:" + stats.getEntityUpdateCount());
writeToBothLogs("Report:" + currentReportId + ":LoadCount:" + stats.getEntityLoadCount());
Я получаю:
29/10/2018 17.16.35:GMT:SummaryReportSection:writeToBothLogs:SEVERE: Report:295:2ndLevelPut:778
29/10/2018 17.16.35:GMT:SummaryReportSection:writeToBothLogs:SEVERE: Report:295:2ndLevelHit:0
29/10/2018 17.16.35:GMT:SummaryReportSection:writeToBothLogs:SEVERE: Report:295:2ndLevelMiss:0
29/10/2018 17.16.35:GMT:SummaryReportSection:writeToBothLogs:SEVERE: Report:295:com.jthink.songlayer.Song:2ndLevelPut:778
29/10/2018 17.16.35:GMT:SummaryReportSection:writeToBothLogs:SEVERE: Report:295:com.jthink.songlayer.Song:2ndLevelHit:0
29/10/2018 17.16.35:GMT:SummaryReportSection:writeToBothLogs:SEVERE: Report:295:com.jthink.songlayer.Song:2ndLevelMiss:0
29/10/2018 17.16.35:GMT:SummaryReportSection:writeToBothLogs:SEVERE: Report:295:com.jthink.songlayer.Song:2ndLevelSizeInMemory:1672432
29/10/2018 17.16.35:GMT:SummaryReportSection:writeToBothLogs:SEVERE: CacheName:com.jthink.songlayer.Song:Put:1333:Hit:2088:Miss:223:Size:223
Итак, Hibernate не показывает хиты, но CacheManager показывает хиты, что объясняет эту разницу?
Кстати, мой файл ehcache.xml -
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<defaultCache
maxEntriesLocalHeap="500"
eternal="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
>
<persistence strategy="localTempSwap"/>
</defaultCache>
<cache
name="com.jthink.songlayer.Song"
maxEntriesLocalHeap="5000"
eternal="false"
memoryStoreEvictionPolicy="LRU"
>
<persistence strategy="localTempSwap"/>
</cache>
</ehcache>