• 自定义更新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定时更新二级缓存。

  • 相关阅读:
    rabbitmq入门
    php7.2 安装redis扩展
    php安装扩展的几种方法
    yum安装php7.2
    相关报错
    [枚举]P1089 津津的储蓄计划
    [DFS]排列的生成
    [枚举]P1085 不高兴的津津
    [模拟]P1047 校门外的树
    [模拟]P1046 陶陶摘苹果
  • 原文地址:https://www.cnblogs.com/qwj888/p/3210660.html
Copyright © 2020-2023  润新知