最近在做一个项目中需要用缓存,项目持久层用的是Hibernate,然后就考虑用二级缓存来实现,但是后来项目扩展,由第三方修改数据这样缓存就会要等到失效后重新获取数据库的数据,本来这样是没问题的,可是领导貌似不接受这样的方式。然后就把缓存设置成永不过期,然后自己定时更新数据加入到Ehcache中去,研究源码发现Hibernate在查询到结果后会把结果集的实体封装成CacheKey、CacheEntry put到二级缓存中去,在put的时候有个判断就是已经存在二级缓存中的key不会被替换,而要求是替换最新的数据。于是就一样画葫芦自己封装CacheKey、CacheEntry 然后put进去,代码如下:
Query query=session.createQuery("from Food fd where fd.dataVersion>? and fd.status<>'1' and fd.isTempDish<>? "); query.setParameter(0,1368741627011L); query.setParameter(1,"1"); query.setCacheable(false); List<Food> foods=query.list(); for (Food food2 : foods) { EntityPersister persister=session.getFactory().getEntityPersister(food2.getClass().getName()); EntityEntry entityEntry= session.getPersistenceContext().getEntry(food2); //缓存key CacheKey cacheKey = new CacheKey( food2.getFoodId(), persister.getIdentifierType(), persister.getRootEntityName(), session.getEntityMode(), session.getFactory() ); //放入缓存的Value Object[] hydratedState = entityEntry.getLoadedState(); CacheEntry entry = new CacheEntry( hydratedState, persister, entityEntry.isLoadedWithLazyPropertiesUnfetched(), null, session, entityEntry ); //获取Cache策略 Ehcache cache=CacheManager.getInstance().getCache("FoodCache"); Element element=new Element(cacheKey,entry); element.setEternal(true); //加入缓存 cache.put(element); } session.close();
Hibernate定时更新二级缓存。