Hibernate和memcached的集成问题

做过的项目中Hibernate都是直接采用ehcache做为缓存,ehcache是一个好东西,采用内存+文件系统 结合可以胜任大多数情况,而且Hibernate和ehcache简直就是天造地设的一对,配合非常之默契。

但是在集群环境下缓存不同步的问题日益凸显,尽管最新版本的ehcache已经支持通过multicast来实 现不同进程的缓存数据同步的功能,这样的结构在集群的节点很多的时候性能下降得厉害,而且也不清楚 其稳定性如何,因此ehcache暂且搁下。

对memcached早有耳闻,它是一种采用客户端服务器工作模式的集中式缓存系统,在很多非常大的网站 中被采用。之前试过Java版的客户端API,发现问题多多容易出错,由于同步的问题导致性能也超级差。 最近Java的客户端API发布了新的版本,再次试用已不可同日而语,于是开始在项目中编写Memcached的 CacheProvider供Hibernate使用,使用过程中碰到一些问题,现在把这些问题的中心思想写出来,希望对 大家有所帮助。

首先ehcache和memcached的结构是完全不相同的。一个ehcache缓存系统可以同时定义多个cache,每 个cache使用key-value方式存储数据,而memcahced只有key-value,它是一个大的哈希表。因此当我们在 Hibernate配置了多个缓存的时候在memcached就会出现问题,这些问题具体表现出来的异常是 ClassCastException,因为不同的对象使用同一个key进行缓存数据的读写。这在ehcache中是没有问题的 ,因为这就是ehcache的结构。由此,为了让Hibernate使用memcached缓存系统,我们需要在Provider这 个级别上对缓存的key进行包装,我们可以将Hibernate传递过来的缓存名跟key结合起来生成一个新的key ,读写缓存数据都是用这个key,这样就不会发生缓存数据冲突导致的异常。

还有另外一个问题是关于查询的缓存,当我们执行一个稍微复杂点的HQL语句并对这个语句的执行禁果 进行缓存的时候可能会出错,这些错误的原因就是key的内容包含某些memcached通讯协议上定义的字符导 致memcached在解析协议的时候出现异常,因此还是使用前面提到的方法,对key进行二次包装。做法不外 乎两种:直接将key转成hashcode然后把hashcode做为新的key;如果担心生成的hashcode可能会重复(事 实上这个可能性微乎其微),那还可以用MD5算法生成新的字符串来做为key,这样就不用担心我们的key 存在一些memcached保留的字符而导致错误。

经过如此改造后,直接将DLOG4J改为memcached做为缓存系统,到目前未知还没发现什么问题,运行非 常良好。

详细的使用方法请查看MemcachedCacheProvider.java中的注释

本文配套源码:http://www.bianceng.net/java/201212/800.htm

时间: 2024-12-29 14:17:06

Hibernate和memcached的集成问题的相关文章

hibernate使用memcached作为二级缓存,怎么构建memcached集群

问题描述 hibernate使用memcached作为二级缓存,怎么构建memcached集群 我使用memcached作为hibernate的二级缓存实现,在memcached单节点的情况下,程序运行没问题.后来想做一个memcached的集群,就使用了magent来做.但是使用magent之后,hibernate的二级缓存就报超时异常:16:29:13832 DEBUG ReadWriteCache:160 - Cached: com.ct.po.TCtBizstatusType#10011

米子SSH之路(二) SSH的配置 (3) 集成Hibernate

今天我们进行SSH配置的最后一步Hibernate的集成. 四,集成Hibernate 4.1 集成Hibernate相关的: a) 这里我们采用的proxool连接池. 据说在Hibernate提供的三种连接池中,效率最好的一个.这里我且听信网络大众的话,等以后我有技 术有能力了,一定会亲自测试一下. b) Hibernate映射采用Hibernate Annonations 技术. 还是在网上,翻了一堆资料后,发现annonations是最为优雅,也是最为省力,效率最高的 4.2 先创建一个

一个简单的hibernate与spring集成

下面介绍一下hibernate与spring的集成,这两个框架的集成关键在于 applicationContext.xml文件的配置,其实很简单的,但需要注意的是,导入包 时一定选择导入到webroot/web-inf/lib目录中,而且hibernate一般要在spring 之前导入,因为集成时要用到sessionFactory类, 一.初始化工作:新建一个项目,如(ssh),在此项目中导入对hibernate的支持 ,新建一个表sstest表,有字段id,username,password,

Hibernate研究

也许你听说过Hibernate的大名,但可能一直不了解它,也许你一直渴望使用它进行开发,那么本文正是你所需要的!在本文中,我向大家重点介绍Hibernate的核心API调用库,并讲解一下它的基本配置. 看完本文后,我相信你对什么是ORM(对像/关系映射)以及它的优点会有一个深刻的认识,我们先通过一个简单的例子开始来展现它的威力. 正如一些传统的经典计算机文章大都会通过一个"hello,world"的例子开始讲解一样,我们也不例外,我们也将从一个相对简单的例子来阐述Hibernate的开

Hibernate+Spring+Struts2框架相关项目示例

问题描述 我想做一个用Hibernate+Spring+Struts2框架集成的项目 解决方案 解决方案二:lz加油解决方案三:嗯加油

spring-hibernate和redis的集成问题

问题描述 hibernate和redis的集成问题 最近想要搭建一个spring hibernate的框架,缓存打算用redis,不知道有没有第三方jar或者其他的方案可以用 解决方案 http://my.oschina.net/yybear/blog/102216

Hibernate 的原理与配置_JSP编程

也许你听说过Hibernate的大名,但可能一直不了解它,也许你一直渴望使用它进行开发,那么本文正是你所需要的!在本文中,我向大家重点介绍Hibernate的核心API调用库,并讲解一下它的基本配置. 看完本文后,我相信你对什么是ORM(对像/关系映射)以及它的优点会有一个深刻的认识,我们先通过一个简单的例子开始来展现它的威力. 正如一些传统的经典计算机文章大都会通过一个"hello,world"的例子开始讲解一样,我们也不例外,我们也将从一个相对简单的例子来阐述Hibernate的开

java学习:Hibernate入门

相对微软的linq-to-sql或EF框架而言,"Hibernate对于eclipse的集成开发" 新手并不容易掌握,下面是新手上路的步骤: 一.准备工作: 1.先下载eclipse (官网 http://eclipse.org/) 注:如本机已经安装了eclipse,可跳过 2.下载Hibernate 最新版本(目前已经到了4.X版本) (官网 http://hibernate.org/ ) 3.根据你的db使用情况,下载对应的jdbc驱动包(本文使用的是oracle,本机安装完or

MySQL & NoSQL – Memcached 插件

大多数人都已经听说 NoSQL 数据库,其中使用最广泛的工具是 Memcached,你们通过 Memcached 再应用层和数据库之间添加一个缓存层.从 MySQL 5.6 开始,你可以获得一个全新的插件,这个插件把 MySQL 和 Memcached 集成起来.在此文中,我们将学习怎样在 Linux 中 安装这个插件,怎样做一些基础的配置. 先决条件 安装 libevent. 译者注:以下命令由译者提供. 命令如下: yum install libevent -y yum install ph