memcached的使用(二)hibernate cache provider

阅读更多
实现hibernate的cache provider,让hibernate使用memcached缓存。
这里比较简单,由于memcached的SockIOPool已经在(一)中spring中初始化了,这里就不考虑pool的初始化,直接获得MemCachedClient使用即可。
然后配置给hibernate×××

附代码:
/**
 * @author Marc
 *
 */
public class MemcachedProvider implements CacheProvider {
	public Cache buildCache(String name, Properties properties) throws CacheException {
		return new MemCache(name);
	}

	public boolean isMinimalPutsEnabledByDefault() {
		return false;
	}

	public long nextTimestamp() {
		return Timestamper.next();
	}

	public void start(Properties properties) throws CacheException {
	}

	public void stop() {
	}

}

/**
 * @author Marc
 * 
 */
public class MemCache implements Cache {
	private static final Log log = LogFactory.getLog(MemCache.class);

	private static final int SIXTY_THOUSAND_MS = 60000;

	MemCachedClient mc;
	String regionName;

	/**
	 * Creates a new Hibernate pluggable cache based on a cache name. 

* * @param cache * The underlying EhCache instance to use. */ public MemCache(String regionName) { mc = new MemCachedClient(); mc.setCompressEnable(false); this.regionName = regionName; } /** * Gets a value of an element which matches the given key. * * @param key * the key of the element to return. * @return The value placed into the cache with an earlier put, or null if * not found or expired * @throws CacheException */ public Object get(Object key) throws CacheException { if (log.isDebugEnabled()) { log.debug("key: " + key); } if (key == null) { return null; } else { Object rt = mc.get(key.toString()); if (rt == null) { if (log.isDebugEnabled()) { log.debug("Element for " + key + " is null"); } return null; } else { return rt; } } } public Object read(Object key) throws CacheException { return get(key); } /** * Puts an object into the cache. * * @param key * a key * @param value * a value * @throws CacheException * if the {@link CacheManager} is shutdown or another * {@link Exception} occurs. */ public void update(Object key, Object value) throws CacheException { put(key, value); } /** * Puts an object into the cache. * * @param key * a key * @param value * a value * @throws CacheException * if the {@link CacheManager} is shutdown or another * {@link Exception} occurs. */ public void put(Object key, Object value) throws CacheException { mc.set(key.toString(), value); } /** * Removes the element which matches the key.

If no element matches, * nothing is removed and no Exception is thrown. * * @param key * the key of the element to remove * @throws CacheException */ public void remove(Object key) throws CacheException { mc.delete(key.toString()); } /** * Remove all elements in the cache, but leave the cache in a useable state. * * @throws CacheException */ public void clear() throws CacheException { log.warn("cann't clear all items in memcached!"); throw new CacheException("cann't clear all items in memcached!"); } /** * Remove the cache and make it unuseable. * * @throws CacheException */ public void destroy() throws CacheException { } /** * Calls to this method should perform there own synchronization. It is * provided for distributed caches. Because EHCache is not distributed this * method does nothing. */ public void lock(Object key) throws CacheException { } /** * Calls to this method should perform there own synchronization. It is * provided for distributed caches. Because EHCache is not distributed this * method does nothing. */ public void unlock(Object key) throws CacheException { } /** * Gets the next timestamp; */ public long nextTimestamp() { return Timestamper.next(); } /** * Returns the lock timeout for this cache. */ public int getTimeout() { // 60 second lock timeout return Timestamper.ONE_MS * SIXTY_THOUSAND_MS; } public String getRegionName() { return this.regionName; } /** * Warning: This method can be very expensive to run. Allow approximately 1 * second per 1MB of entries. Running this method could create liveness * problems because the object lock is held for a long period

* * @return the approximate size of memory ehcache is using for the * MemoryStore for this cache */ public long getSizeInMemory() { log.warn("cann't getSizeInMemory in memcached!"); throw new CacheException("cann't getSizeInMemory in memcached!"); } public long getElementCountInMemory() { log.warn("cann't getElementCountInMemory in memcached!"); throw new CacheException("cann't getElementCountInMemory in memcached!"); } public long getElementCountOnDisk() { log.warn("cann't getElementCountOnDisk in memcached!"); throw new CacheException("cann't getElementCountOnDisk in memcached!"); } public Map toMap() { log.warn("cann't toMap in memcached!"); throw new CacheException("cann't toMap in memcached!"); } public String toString() { return "MemCached(" + getRegionName() + ')'; } }

你可能感兴趣的:(memcached,Cache,Hibernate,Spring,SQL)