zoukankan      html  css  js  c++  java
  • 自定义更新Hibernate Ehcache

      最近在做一个项目中需要用缓存,项目持久层用的是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定时更新二级缓存。

  • 相关阅读:
    mac 配置环境变量
    c语言中的0UL或1UL是什么意思
    javascript类型系统——正则表达式RegExp类型
    javascript运算符——算术运算符
    javascript类型系统——Number数字类型
    javascript类型系统——包装对象
    javascript基础语法——表达式
    valueOf()方法
    toString()方法
    javascript基础语法——变量和标识符
  • 原文地址:https://www.cnblogs.com/qwj888/p/3210660.html
Copyright © 2011-2022 走看看