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

自定义更新Hibernate Ehcache的更多相关文章

  1. CodePush自定义更新弹框及下载进度条

    CodePush 热更新之自定义更新弹框及下载进度 先来几张弹框效果图 非强制更新场景 image 强制更新场景 image 更新包下载进度效果 image 核心代码 这里的热更新Modal框,是封装 ...

  2. Hibernate+EhCache配置二级缓存

    步骤: 第一步:加入ehcache.jar 第二步: 在src目录下新建一个文件,名为:ehcache.xml 第三步:在hibernate配置文件的<session-factory>下配 ...

  3. 转Spring+Hibernate+EHcache配置(三)

    配置每一项的详细作用不再详细解释,有兴趣的请google下 ,这里需要注意一点defaultCache标签定义了一个默认的Cache,这个Cache是不能删除的,否则会抛出No default cac ...

  4. 【转】Spring+Hibernate+EHcache配置(一)

    大量数据流动是web应用性能问题常见的原因,而缓存被广泛的用于优化数据库应用.cache被设计为通过保存从数据库里load的数据来减少应用和数据库之间的数据流动.数据库访问只有当检索的数据不在cach ...

  5. hibernate ehcache二级缓存

    xml配置 <?xml version="1.0" encoding="UTF-8"?> <ehcache> <!-- Sets ...

  6. 转Spring+Hibernate+EHcache配置(二)

    Spring AOP+EHCache简单缓存系统解决方案 需要使用Spring来实现一个Cache简单的解决方案,具体需求如下:使用任意一个现有开源Cache Framework,要求可以Cache系 ...

  7. es增量自定义更新的脚本

    安装需要可软件 sudo apt-get install python-pip sudo pip install elasticsearch; sudo apt-get install python- ...

  8. decimal类型不能为空,自定义update更新null值的问题。

    if (!string.IsNullOrEmpty(yt_time_limit_1)) { entity["yt_time_limit_1"] = Convert.ToDecima ...

  9. EAV/ESS 8.x 自定义服务器正确方法+更新服务器列表

    下面用64位的ESET Smart Security 8.0.319.1进行设置自定义更新服务器说明(注:修改方法32位和64位通用) 1.  让我们先看一下ESET Smart Security 8 ...

随机推荐

  1. input美化 checkbox和radio样式

    input美化    checkbox和radio样式 看惯了input[checkbox]和input[radio]默认样式,有没有想要改变一下呢?比如下面的样式: 比起html默认的样式,上图这些 ...

  2. https双向认证demo

    阅读此文首先需要具备数据加解密,公钥,私钥,签名,证书等基础知识. 通信服务端:使用tomcat 通信客户端:使用apache httpclient 4.5.1 1. 服务端操作 . keytool ...

  3. Android-多平台分享(新浪微博)

    很多时候,我们都会用到分享,比如说逛淘宝时,看中一件衣服,想要给小伙伴看看,我会将这件宝贝分享给我的小伙伴,当然,分享的平台就有很多啦,我分享他微信.QQ.或者微博都是可以,但是本人最喜欢微信分享啦 ...

  4. 2014.10.09 Andrew 学习 WPF(刘铁锰) 笔记分享

    引言 主要是讲了关于WPF只是表现层的工具. 第一章: XAML : 可扩张应用程序标记语言    Extensible Application Markup Language 什么是XAML?  X ...

  5. sql Truncate 与 delete的区别

    Truncate 语法 TRUNCATE TABLE     [ { database_name .[ schema_name ] . | schema_name . } ]     table_na ...

  6. WCF学习笔记(2)——使用IIS承载WCF服务

    通过前面的笔记我们知道WCF服务是不能独立存在,必须“寄宿”于其他的应用程序中,承载WCF服务的应用程序我们称之为“宿主”.WCF的多种可选宿主,其中比较常见的就是承载于IIS服务中,在这里我们来学习 ...

  7. MVC5 属性路由

    属性路由(attribute routing)是最新被引进到MVC5中的,它和传统路由共同组成了mvc5中的两种主要路由. 1. 高质量的url应该满足以下几点 域名便于记忆和拼写 简短 便于输入 可 ...

  8. (转)MongoDB 3.0 WT引擎参考配置文件

    mongodb 3.0 改变很多,从2.6版本升级到3.0要关注的细节很多,如权限等等.3.0在数据存储引擎上更换成了wiredTiger,在数据压缩方面很有效,解决大数据量问题的情况下,磁盘不够用的 ...

  9. [Silverlight] Visual Studio2010不能安装Silverlight4_Tools,提示语言不一致

    今天在装Silverlight4_Tools时出现“必须先安装与 Silverlight Tools 4 语言版本相一致的 Visual Studio 2010.Visual Web Develope ...

  10. windows通过thrift访问hdfs

    thirift是一个支持跨种语言的远程调用框架,通过thrift远程调用框架,结合hadoop1.x中的thriftfs,编写了一个针对hadoop2.x的thriftfs,供外部程序调用. 1.准备 ...