Implementing the CacheController:
import java.io.File; import java.net.URL; import java.util.Properties; import net.sf.ehcache.Element; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Cache; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.ibatis.sqlmap.engine.cache.CacheModel; import com.ibatis.sqlmap.engine.cache.CacheController; public class EhcacheIbatisCacheController implements CacheController { final private static Logger logger = LoggerFactory.getLogger(EhcacheIbatisCacheController.class); /** 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. */ public Object getObject(CacheModel cacheModel, Object key) { Object result = null; try { Element element = getCache(cacheModel).get(key.toString()); if (element != null) { result = element.getObjectValue(); } } catch(Exception e) { logger.debug("cache miss, will check in db"); } 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 value to add. */ public void putObject(CacheModel cacheModel, Object key, Object object) { getCache(cacheModel).put(new Element(key.toString(), 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.toString()); getCache(cacheModel).remove(key.toString()); return result; } /** * Configure a cache controller. Initialize the Cache Manager of Ehcache * @param props - the properties object containing configuration information. */ public void setProperties(Properties props) { String configFile = props.getProperty("configFile"); File file = new File(configFile); if(file.exists()) { cacheManager = CacheManager.create(file.getAbsolutePath()); } else { URL url = getClass().getResource(configFile); cacheManager = CacheManager.create(url); } } /** * Gets a ehcache based on an iBatis cache Model. * @param cacheModel - the cache model. * @return the Cache. */ private Cache getCache(CacheModel cacheModel) { String cacheName = cacheModel.getId(); return cacheManager.getCache(cacheName); } }Each method provides access to the CacheModel that controls the cache so you can access parameters in the CacheModel when required.
Registering EhcacheIbatisController with iBATIS:
CacheModels and CacheControllers must be registered in the ibatis xml. 1st create an alias for the Ehcache controller as follows:
Now we need to apply the Cache controller to a CacheModel definition in the xml.
This comment has been removed by the author.
ReplyDelete