目前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(); } }
上述思路和代码希望能够起到抛砖引玉作用。