做过的项目中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保留的字符而导致错误。
分享到:
相关推荐
标题中的"jar包整合:Springmvc+hibernate+Ehcache+shiro+mysql+Oracle+fastjson"指的是一个综合性的Java项目,它集成了多种技术框架,用于构建高效、可扩展的Web应用。让我们逐一解析这些技术的核心知识点: 1. **...
5. **缓存机制**:集成Infinispan、EhCache和Memcached,提供高效的缓存解决方案,优化应用性能,减少对数据库的访问压力。 6. **与Adobe ColdFusion CFML兼容**:Lucee为Adobe ColdFusion CFML提供了一个兼容层,...
5. **Hibernate4与memcached集成**:使用特定的Hibernate缓存插件(如hibernate-ehcache或spymemcached),可以将memcached作为二级缓存,提高数据读取速度。 6. **jar包的使用**:将hibernate4集成memcached所需的...
首先,Ehcache是一款基于Java的开源分布式缓存系统,它是Hibernate框架的默认缓存提供商,因此在Java社区中非常流行。Ehcache提供了磁盘存储、内存管理以及缓存过期策略等功能,支持事务处理和多级缓存结构。其主要...
- 如果项目使用Hibernate,可以集成Ehcache或第三方memcached实现(如hibernate-ehcache-memcached),配置hibernate.cfg.xml或使用XML/Annotation方式定义缓存策略。 5. **使用示例**: - 在服务端,可以通过...
ehcache 二级缓存 配置...<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory 3.3配置如下: <property name="hibernate.cache.use_second_level_cache">true ...
Lucee简化了Web服务(REST,SOAP,HTTP),ORM(Hibernate),搜索(Lucene),数据源(MSSQL,Oracle,MySQL等),缓存(infinispan,ehcache和memcached)等技术。 Lucee使用更少的资源并提供了更好的性能为Adobe...
9. **扩展性**:Ehcache通过插件机制支持与其他技术集成,如Spring框架、Hibernate ORM等,方便开发者在已有项目中无缝接入缓存服务。 10. **性能优化**:Ehcache 3.8.1版本可能会包含性能优化,如更快的缓存查找、...
3. **Hibernate与memcached集成**:将memcached作为Hibernate二级缓存的提供者,需要配置相应的插件或库,如hibernate-ehcache或hibernate-memcached。集成过程通常包括配置Hibernate的配置文件(hibernate.cfg.xml...
**三、Hibernate与EHCache集成** 在ORM框架Hibernate中,EHCache可以作为二级缓存,进一步优化数据访问效率。配置包括: 1. **Hibernate配置:**在`hibernate.cfg.xml`中启用二级缓存并指定EHCache为提供者。 2. *...
在Java开发中,使用Memcached通常需要通过Java客户端库来与服务器端通信。这些客户端库提供了简单的API接口,使得开发者能够方便地进行缓存操作。例如,Java中常用的Memcached客户端有spymemcached、xmemcached等,...
缓存提供商如Ehcache或Memcached可以集成到Hibernate中,缓存对象实例以减少对数据库的访问。 9. **实体状态管理**:Hibernate 3.2 理解对象的生命周期,包括瞬时态(Transient)、持久态(Persistent)、游离态...
Ehcache的主要特性包括缓存分区、缓存过期策略、缓存预热以及与Hibernate等ORM框架的集成。源代码中可能包含了Ehcache的使用示例,展示了如何创建缓存实例、添加和检索数据,以及如何配置缓存策略。 其次,...
### Hibernate配置二级与三级缓存详解 在Java开发领域中,Hibernate作为一种流行的ORM(对象关系映射)框架,被广泛应用于数据库操作。为了提高应用程序的性能,Hibernate支持多种级别的缓存机制,其中最为常见的是...
8. **缓存机制**:探讨Hibernate的缓存策略,包括一级缓存和二级缓存,以及第三方缓存解决方案如EHCache和Memcached的集成。 9. **性能优化**:提供实用技巧和最佳实践,帮助开发者提升Hibernate应用的性能,如...
一级缓存(Session 缓存)是默认的,而二级缓存(可配置的)可以跨多个 Session 共享,例如使用 EhCache 或 Memcached。 ### 8. 支持多种数据库 Hibernate 3.2 具有良好的数据库无关性,支持多种主流的关系型...
- 第三方缓存集成:如 EhCache,Memcached,可以进一步提升系统性能。 - Hibernate的性能优化:包括缓存策略调整、批处理、连接池优化等。 以上就是关于Hibernate的一些基本知识点,涵盖了其核心概念、工作原理、...
此外,还有第三方缓存服务,如 Ehcache 和 Memcached,它们可以进一步提升系统的响应速度。 事务处理在Hibernate中也很重要,`Transaction`接口提供了开始、提交和回滚事务的方法。在数据库操作中,确保数据的一致...