`
footman265
  • 浏览: 114508 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

Hibernate 和 memcached 的集成问题

    博客分类:
  • j2SE
阅读更多

做过的项目中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做为缓存系统,到目前未知还没发现什么问题,运行非常良好。

本文所用到的代码已经编译完毕并打包,下载地址如下:

/uploads/files/memcached_provider_0_1.jar

分享到:
评论

相关推荐

    hibernate-memcached包

    用于hibernate集成memcached作为二级缓存所需要的包,1.2.2版本

    hibernate集成memcached所需jar

    memcached-2.5-sources.jar、hibernate-memcached-1.2.2-sources.jar、spy-2.4.jar这三个jar不太好找,剩下两个commons-codec和slf4j-log4j直接maven配置一下就行 <groupId>org.slf4j <artifactId>slf4j-log4j12 ...

    hibernate-memcached

    hibernate-memcached,一个分布式缓存框架,很强大,这里提供hibernate集成jar

    hibernte4集成memcahce

    Hibernate4集成memcache用jar合集 hibernate配置 <property name="hibernate.cache.region.factory_class">com.googlecode.hibernate.memcached.MemcachedRegionFactory</property>

    Spring4+SpringMVC+mysql+memcached【同时支持mybatis+hibernate两种底层操作框架】

    项目使用Spring4+SpringMVC+mysql【同时支持mybatis+hibernate两种底层操作框架】+memcached

    memcached套装

    memcached套装, 包含memcached linux安装包,hibernate4集成memached所需要的jar包。

    java博客系统源码hibernate4.3.6+spring4.0.6+struts2.3.16整合、html5全ajax,后台easyui

    本博客源码采用hibernate4.3.6+spring4.0.6+struts2.3.16整合开发,集成memcached。加入本地缓存。html5前端页面,清一色ajax加载,后端采用easyUi。后台功能有待完善。By:WebSos

    learning:Git学习

    一直在金融行业里做软件项目,见识了各种形形色色的企业软件开发框架,由于金融行业...3、Hibernate和Mybatis的集成,DB的事务管理由Hibernate提供支持,所以一般增删改的操作由Hibernate来完成,而查询则交由Mybatis。

    IOIF基于开源技术的JAVA开发框架

    IOIF以EXTJS为前端,以Spring、Struts、Hibernate为后端,整合了Proxool、Log4j、Quartz、Oscache、Castor、Memcached、redis等优秀的开源软件。 支持Tomcat6及Resin3等应用服务器,支持Oracle、MYSQL等数据库。IOIF...

    IOIF面向项目的开源开发框架

    IOIF以EXTJS为前端,以Spring、Struts、Hibernate为后端,整合了Proxool、Log4j、Quartz、Oscache、Castor、Memcached、redis等优秀的开源软件。 支持Tomcat6及Resin3等应用服务器,支持Oracle、MYSQL等数据库。IOIF...

    java开源包1

    同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是...

    java开源包11

    同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是...

    java开源包2

    同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是...

    java开源包3

    同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是...

    java开源包6

    同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是...

    java开源包5

    同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是...

    java开源包10

    同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是...

    java开源包4

    同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是...

    java开源包8

    同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是...

    java开源包7

    同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是...

Global site tag (gtag.js) - Google Analytics