问题
I defined a second level cache in my application using @Cache annotation
I am using findById query, as the following:
long id = 4;
Company cmp = companyDAO.findById(id);
Where Company is the object that I get from the DB.
How can I check if the Company object came from the DB or from the cache?
回答1:
Try HitCount and/or MissCount API.
Something like this.....
int oldMissCount = sessionFactory.getStatistics().getSecondLevelCacheStatistics(rName).getMissCount();
int oldHitCount = sessionFactory.getStatistics().getSecondLevelCacheStatistics(rName).getHitCount();
long id = 4;
Company cmp = companyDAO.findById(id);
int newMissCount = sessionFactory.getStatistics().getSecondLevelCacheStatistics(rName).getMissCount();
int newHitCount = sessionFactory.getStatistics().getSecondLevelCacheStatistics(rName).getHitCount();
if(oldHitCount+1 == newHitCount && oldMissCount+1 == newMissCount) {
logger.debug("came from DB");
} else if(oldHitCount+1 == newHitCount && oldMissCount == newMissCount) {
logger.debug("came from cache");
}
回答2:
How can I check if the Company object came from the DB or from the cache?
Hibernate uses a specific category to Log all second-level cache activity. The relevant category is org.hibernate.cache
, just enable debug for it in the configuration of your logging framework.
See Chapter 3.5 Logging.
回答3:
Turn on cache logging.
来源:https://stackoverflow.com/questions/3156133/hibernate-second-level-cache-print-result