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

  • 相关阅读:
    Borland C++ Builder Practical learning series
    vmware打开vmx文件不能创建虚拟机的问题
    c3p0 连接数据库失败的问题
    外在 挺直背和走路的问题
    JAVAWEB tomcat服务器启动错误原因总结
    JAVAWEB 项目注册登录模块问题总结
    JAVA eclipse Maven项目红叹号解决方案
    JAVA 文件读取写入后 md5值不变的方法
    Git的安装配置(win环境)
    JAVA 静态方法和实例方法的区别 (图表)
  • 原文地址:https://www.cnblogs.com/qwj888/p/3210660.html
Copyright © 2011-2022 走看看