Ehcache 跟 Ibatis 集成

本文介绍如何在iBatis中使用EhCache作为缓存实现,并提供了详细的配置示例,包括sqlMap配置文件和ehcache配置文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[b]Ehcache Controller class[/b]

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();
}
}
}



[b]A Sample sqlMap 配置文件[/b]


<?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就根本不会去作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值