`
masterkey
  • 浏览: 337645 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Memcached 作为Hibernate的二级缓存

阅读更多
   hibernate的缓存机制是其成为主流持久层霸主地位的重要组成部分。二级缓存是SessionFactory级别的全局缓存,可以通过配置文件的hibernate.cache.provider_class 进行指定。
目前Hiberante 的二级缓存实现方式:

1.EhCache
2,Hashtable
3.JndiBoundTreeCache
4.NoCache
5.OptimisticTreeCache
6.OSCache
7.TreeCache
8.SwarmCache


大致分为上述8种缓存方案的实现,主要分为内存和文件两种方式进行存储。

hibernate的二级缓存默认是不开启的,就是采用NoCacheProvider

public static final String DEF_CACHE_PROVIDER = NoCacheProvider.class.getName();


就提出较大的设想,采用Memcached作为hibernate的二级缓存存储方式。采用Memcached作为Hibernate的二级缓存具有良好的分布式特性。

多台基于Hiberante进行不部署部署,可以共享二级缓存,是不是很爽,赫赫!

在这里我们就采用Memcached作为hibernate的二级缓存。主要实现Hibernate的两个接口: org.hibernate.cache.Cache,org.hibernate.cache.CacheProvider,实现我们自己的方法。在这里,我们采用

如下代码只给出了关键思路和主要方法,一些异常,日志,属性文件操作等非关键代码没有加,算是一个Demo code吧。
下面定义:MemcachedCache ,

package xxxx.memcached;

import java.util.Map;
import java.util.Properties;

import org.hibernate.cache.Cache;
import org.hibernate.cache.CacheException;

import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
/*
 * Copyright By C.F @http://masterkey.iteye.com
 * hibernate with Memcached Cache
 * Memcached 1.2.x ,java_memcached from http://www.whalin.com/memcached/
 * demo code 
 */
public class MemCachedCache implements Cache {
	private MemCachedClient cacheClient;
	private String _regionName;
	public MemCachedCache(String regionName, Properties properties)
	{
		_regionName = regionName;
		//serverlist = cache1.int.meetup.com:12345;cache0.int.meetup.com:12345
		String servers =(String)(properties.get("serverlist"));
		String[] serverlist = servers.split(";"); 
		// initialize the pool for memcache servers
		SockIOPool pool = SockIOPool.getInstance();

		pool.setServers( serverlist );
		
		pool.setInitConn(Integer.parseInt((String)properties.get("InitConn")));
		pool.setMinConn(Integer.parseInt((String)properties.get("MinConn")));
		pool.setMaxConn(Integer.parseInt((String)properties.get("MaxConn")));
		pool.setMaintSleep(Integer.parseInt((String)properties.get("MaintSleep")));

		pool.setNagle(Boolean.parseBoolean((String)properties.get("Nagle")));
		pool.initialize();	


		
	}
	public void clear() throws CacheException {
		// TODO Auto-generated method stub
		
	}

	public void destroy() throws CacheException {
		// TODO Auto-generated method stub
		
	}

	public Object get(Object key) throws CacheException {
		// TODO Auto-generated method stub

		return cacheClient.get(toString(key));
	}

	public long getElementCountInMemory() {
		// TODO Auto-generated method stub
		return 0;
	}

	public long getElementCountOnDisk() {
		// TODO Auto-generated method stub
		return 0;
	}

	public String getRegionName() {
		// TODO Auto-generated method stub
		return _regionName;
	}

	public long getSizeInMemory() {
		// TODO Auto-generated method stub
		return 0;
	}

	public int getTimeout() {
		// TODO Auto-generated method stub
		return 0;
	}

	public void lock(Object key) throws CacheException {
		// TODO Auto-generated method stub
		
	}

	public long nextTimestamp() {
		// TODO Auto-generated method stub
		return 0;
	}

	public void put(Object key, Object value) throws CacheException {
		// TODO Auto-generated method stub
		cacheClient.set(toString(key), value);
		
	}

	public Object read(Object key) throws CacheException {
		// TODO Auto-generated method stub
		return get(key);
	}

	public void remove(Object key) throws CacheException {
		// TODO Auto-generated method stub
		cacheClient.delete(toString(key));
		
	}

	public Map toMap() {
		// TODO Auto-generated method stub
		return null;
	}

	public void unlock(Object key) throws CacheException {
		// TODO Auto-generated method stub
		
	}

	public void update(Object key, Object value) throws CacheException {
		// TODO Auto-generated method stub
		cacheClient.replace(toString(key), value);
	}
	public String toString(Object key)
	{
		return _regionName+(String)key;
	}


}


接着我们需要实现MemcachedCacheProvider
package xxxx.memcached;

import java.util.Properties;

import org.hibernate.cache.Cache;
import org.hibernate.cache.CacheException;
import org.hibernate.cache.CacheProvider;
import org.hibernate.cache.Timestamper;

import com.danga.MemCached.SockIOPool;

/*
 * Copyright By C.F @http://masterkey.iteye.com
 * hibernate with Memcached Cache
 * Memcached 1.2.x ,java_memcached from http://www.whalin.com/memcached/
 * demo code 
 */
public class MemCachedProvider implements CacheProvider{
    private SockIOPool pool;
    private MemCachedCache memcachedCache = null;
	public Cache buildCache(String regionName, Properties properties)
			throws CacheException {
		// TODO Auto-generated method stub

		return new MemCachedCache(regionName,properties);
	}

	public boolean isMinimalPutsEnabledByDefault() {
		// TODO Auto-generated method stub
		return false;
	}

	public long nextTimestamp() {
		// TODO Auto-generated method stub
		return Timestamper.next();
	}

	public void start(Properties properties) throws CacheException {
		// TODO Auto-generated method stub
		
	}

	public void stop() {
		// TODO Auto-generated method stub
        if(null != pool)
            pool.shutDown();


    }

}


上述思路和代码希望能够起到抛砖引玉作用。
14
1
分享到:
评论
4 楼 fangzhouxing 2009-03-01  
多台基于Hiberante进行不部署部署???
3 楼 masterkey 2008-05-04  
其实我感觉自己去实现业务的缓存会更加有效,有的放矢。
2 楼 YRHYRH 2008-04-30  
现在分布式缓存技术的确是有市场的需求了。开源的方案也很多。缓存命中的效率才是最大的问题。hibernate复杂查询结果的缓存命中的效率问题很多。
1 楼 squirel 2008-04-25  
good idea!

相关推荐

    memcached作为hibernate二级缓存必备的jar包

    标题提到的"memcached作为hibernate二级缓存必备的jar包",指的是将分布式内存缓存系统Memcached集成到Hibernate框架中,用作二级缓存。这样做的主要目的是进一步优化数据读取,降低数据库压力。以下是描述中列出的...

    Hibernate4二级缓存实例(源码)

    3. **Hibernate与memcached集成**:将memcached作为Hibernate二级缓存的提供者,需要配置相应的插件或库,如hibernate-ehcache或hibernate-memcached。集成过程通常包括配置Hibernate的配置文件(hibernate.cfg.xml...

    hibernate-memcached, 在Hibernate中,使用Memcached作为第二级分布式缓存的库.zip

    hibernate-memcached, 在Hibernate中,使用Memcached作为第二级分布式缓存的库 休眠 memcachedHibernate中使用Memcached作为第二级分布式缓存的库。基于优秀的spymemcached客户端包含对 Whalin ( danga ) memcached...

    项目中使用 hibernate-memcached 做二级缓存

    2. **配置Hibernate**:在Hibernate的配置文件(如hibernate.cfg.xml)中,启用二级缓存并指定使用Hibernate-Memcached作为缓存提供者。 3. **配置Memcached服务器**:设置连接到Memcached服务器的参数,包括主机...

    hibernate4.0使用二级缓存jar包

    ehcache 二级缓存 配置使用的jar包 配置如下: <!-- 启用二级缓存 --> <property name="hibernate.cache.use_second_level_cache">true <!-- 查询的二级缓存配置 --> <property name="hibernate....

    最新二级缓存memcached,支持hibernate4

    解决目前memcached不支持hibernate4的缺陷,hibernate配置<property name="hibernate.cache.region.factory_class">com.googlecode.hibernate.memcached.MemcachedRegionFactory</property>

    memcached整合hibernate资源合集

    2. **配置Hibernate缓存**:在Hibernate的配置文件中,你需要指定使用Memcached作为二级缓存提供者。这可能涉及修改`hibernate.cache.region.factory_class`属性,设置为对应的Memcached缓存区域工厂类。 3. **集成...

    hibernate-memcached包

    **hibernate-memcached包** 是一个专为Hibernate框架设计的扩展,目的是将流行的分布式内存缓存系统Memcached整合到Hibernate中,作为其二级缓存解决方案。在大型分布式应用中,缓存技术是提高性能的关键,特别是...

    配置memecached作hibernate4的二级缓存

    本篇将详细讲解如何配置Memcached作为Hibernate 4的二级缓存,以及相关的知识点。 首先,我们需要了解什么是Memcached。Memcached是一款高性能、分布式内存对象缓存系统,它用于存储中间结果或临时数据,以减少对...

    hibernate配置二三级缓存

    为了提高应用程序的性能,Hibernate支持多种级别的缓存机制,其中最为常见的是二级缓存。此外,还有一些场景下会用到所谓的“三级缓存”,虽然这一术语在官方文档中并未明确提及,但在实际应用中通常指的是查询缓存...

    hibernate-memcached-1.1.0-sources.zip

    `hibernate-memcached-1.1.0-sources.zip`提供的源码实现了一个Hibernate二级缓存提供者,它将Hibernate的查询结果缓存在Memcached中,当再次进行相同查询时,可以直接从缓存中获取数据,避免了重复的数据库查询。...

    memcache也spring,hibernate的配置

    - 在Hibernate配置中指定使用hibernate-memcached作为二级缓存。 - 如果单独使用Spring,需要配置Spring的缓存管理器,并关联xmemcache-spring的相关配置。 - 在需要缓存的方法上使用Spring的缓存注解。 8. **...

    memcached整合进hibernate4的资源包

    hibernate使用memcached作为二级缓存所需要的资源包,包括memcached的windows安装文件、hibernate3和hibernate4整合memcached的jar包 文件目录:commons-codec-1.10.jar、hibernate3-memcached-1.5.jar、hibernate4-...

    Hibernate缓存深入详解.ppt

    在分布式环境下,二级缓存可以通过配置实现分布式缓存,如使用Redis、Memcached等。这种方式可以在多台服务器之间共享数据,提高系统的可扩展性和性能。同时,需要处理好分布式环境下的数据一致性问题,如采用事件...

    hibernate 缓存

    本篇将深入探讨Hibernate的缓存机制,包括一级缓存和二级缓存,并涉及二级缓存的高级应用——分布式缓存和查询缓存。 ### 1. Hibernate缓存概述 **缓存的作用**:减少对数据库的访问次数,从而提高应用性能。...

    Hibernate缓存

    Hibernate提供了两种级别的缓存:一级缓存和二级缓存。一级缓存是Session级别的,而二级缓存是SessionFactory级别的全局缓存。这两个缓存都是为了存储持久化对象,以减少与数据库的交互。 1-2 Hibernate缓存分类: ...

    hibernate整合memcached需要的jar包

    这个库包含了一些核心接口和实现,如`MemcachedCacheProvider`,它是Hibernate缓存提供者的一种实现,用于将传统的第二级缓存替换为Memcached。 2. **memcached-2.3.1.jar**:这是Memcached的Java客户端库,负责与...

    hibernate-memcached-1.1.0-javadoc.zip

    Hibernate Memcached是将Memcached作为二级缓存机制引入到Hibernate中的一个插件,它允许开发者将频繁访问的数据存储在内存缓存中,以提高应用的响应速度。Hibernate Memcached 1.1.0版提供了完整的API文档和...

Global site tag (gtag.js) - Google Analytics