`
elicer
  • 浏览: 131179 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Ehcache 跟 Ibatis 集成

阅读更多
Ehcache Controller class
package com.ibatis.sqlmap.engine.cache.EhCacheController;

import java.net.URL;
import java.util.Properties;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

import com.ibatis.sqlmap.engine.cache.CacheController;
import com.ibatis.sqlmap.engine.cache.CacheModel;

/**
 * EhCache Implementation of the {@link com.ibatis.sqlmap.engine.cache.CacheController} interface to be able to use
 * EhCache as a cache implementation in iBatis. You can configure your cache model as follows, by example, in your
 * sqlMapping files:
 * <cacheModel id="myCache" type="nl.rabobank.springproject.ibatis.EhCacheController" readOnly="true" serialize="false">
 *   <property name="configFile" value="/path-to-ehcache.xml"/>
 * </cacheModel>
 * Alternatively, you can use a type alias in your type attribute and defining the class with a
 * <TypeAlias> declaration, see iBatis documentation on how to do this.
 */
public class EhCacheController implements CacheController {

    /** The EhCache CacheManager. */
    private CacheManager cacheManager;

    /**
     * Flush a cache model.
     * @param cacheModel - the model to flush.
     */
    public void flush(CacheModel cacheModel) {
        getCache(cacheModel).removeAll();
    }

    /**
     * Get an object from a cache model.
     * @param cacheModel - the model.
     * @param key        - the key to the object.
     * @return the object if in the cache, or null(?).
     */
    public Object getObject(CacheModel cacheModel, Object key) {
        Object result = null;
        Element element = getCache(cacheModel).get(key);
        if (element != null) {
            result = element.getObjectValue();
        }
        return result;

    }

    /**
     * Put an object into a cache model.
     * @param cacheModel - the model to add the object to.
     * @param key        - the key to the object.
     * @param object     - the object to add.
     */
    public void putObject(CacheModel cacheModel, Object key, Object object) {
        getCache(cacheModel).put(new Element(key, object));
    }

    /**
     * Remove an object from a cache model.
     * @param cacheModel - the model to remove the object from.
     * @param key        - the key to the object.
     * @return the removed object(?).
     */
    public Object removeObject(CacheModel cacheModel, Object key) {
        Object result = this.getObject(cacheModel, key);
        getCache(cacheModel).remove(key);
        return result;
    }

    /**
     * Configure a cache controller. Initialize the EH Cache Manager as a singleton.
     * @param props - the properties object continaing configuration information.
     */
    public void setProperties(Properties props) {
        URL url = getClass().getResource(props.getProperty("configFile"));
        cacheManager = CacheManager.create(url);
    }

    /**
     * Gets an EH Cache based on an iBatis cache Model.
     * @param cacheModel - the cache model.
     * @return the EH Cache.
     */
    private Cache getCache(CacheModel cacheModel) {
        String cacheName = cacheModel.getId();
        Cache cache = cacheManager.getCache(cacheName);
        return cache;
    }

    /**
     * Shut down the EH Cache CacheManager.
     */
    public void finalize() {
        if (cacheManager != null) {
            cacheManager.shutdown();
        }
    }
}



A Sample sqlMap 配置文件

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="myNamespace">


  <!-- Use type aliases to avoid typing the full classname every time. -->
  <typeAlias alias="MyPojo" type="nl.myproject.MyPojo"/>
  <typeAlias alias="MapCacheController" type="com.ibatis.sqlmap.engine.cache.EhCacheController"/>

  <cacheModel id="MyPojoCache" type="MapCacheController" readOnly="true" serialize="false">
    <property name="configFile" value="/ehcache.xml"/>
  </cacheModel>

  <resultMap id="ResultQueryMap" class="MyPojo">
    ...property mappings go here...
  </resultMap>

  <select id="getMyPojoList" resultMap="ResultQueryMap" cacheModel="MyPojoCache">
    ...select query to get your pojo from the database goes here...
  </select>

</sqlMap>





A sample ehcache 配置文件


<ehcache>

  ...put your default cache here...

  <cache
    name="myNamespace.MyPojoCache"
    maxElementsInMemory="5"
    eternal="false"
    timeToLiveSeconds="60"
    overflowToDisk="false"
    memoryStoreEvictionPolicy="LRU"/>

</ehcache>




总结:
1.你可以建多个CacheModel 在sqlmap的配置文件中,然后指定到同一个cacheController.
2.记住不要忘了 设置  cacheModelsEnabled=true (在sqlmap的<setting>)否则你的cache就根本不会去作用。

2
0
分享到:
评论
8 楼 elicer 2012-04-19  
tanglingshuai 写道
i swear 刚才的 swear 无效

你只要实现相应的接口就行了,具体起不起作用,那完全看你自己的实现是不是对的。
7 楼 tanglingshuai 2012-04-11  
i swear 刚才的 swear 无效
6 楼 tanglingshuai 2012-04-11  
i swear doesn't work
5 楼 snowolf 2012-03-08  
嗨!如果做一个Memcached的Controller呢?譬如XMemcached的实现?
4 楼 elicer 2009-11-18  
jbas 写道
ibatis不是已经有自己的缓存机制了吗?干吗还来个集成ehcache?

我知道ibatis 有自己的cache,但我写这片文章的目的是为了,展示一个ibatis跟第三方的cache集成的例子。
3 楼 elicer 2009-11-18  
老兄com.ibatis.sqlmap.engine.cache.EhCacheController是我自己写的一个类,ibatis提供了一个CacheController 接口,让你自己来实现跟第三方的cache结成。
2 楼 zhb01 2009-11-18  
com.ibatis.sqlmap.engine.cache.EhCacheController在iBATIS 2.3.4 jar中没有这个类,请问你是怎么配置ehcache的
1 楼 jbas 2009-11-01  
ibatis不是已经有自己的缓存机制了吗?干吗还来个集成ehcache?

相关推荐

Global site tag (gtag.js) - Google Analytics