Question

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?

Was it helpful?

Solution

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");
}

OTHER TIPS

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.

Turn on cache logging.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top