`

iBatis整理——EhCache支持扩展

阅读更多
项目完结,整理一些技术方面的相关收获。
已经记不得EhCacheController这个实现类最早来自于那里了,总之稍加修改后非常有效果,大家就这么用了,感谢最初开源的那位兄弟。这里,主要是做个记录,为以后类似扩展(譬如Memcached)做个准备。

iBatis提供CacheController接口,用于实现第三方缓存架构的扩展。
这里以iBatis 2.3.0,EhCache 1.2.3版本为基础,构建iBatis+EhCache实现。

EhCacheController类:
package com.ibatis.sqlmap.engine.cache.ehcache;

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:
 * 
 * <pre>
 * <code>
 * <cacheModel id="myCache" readOnly="true" serialize="false"
 * 	type="com.ibatis.sqlmap.engine.cache.EhCacheController" > 
 * 	<property name="configLocation"
 * 		value="/path-to-ehcache.xml"/> 
 * </cacheModel> </code>
 * </pre>
 * 
 * Alternatively, you can use a type alias in your type attribute and defining
 * the class with a <code><typeAlias></code> declaration:
 * 
 * <pre>
 * <code>
 * <sqlMapConfig>
 * 	<typeAlias alias="EHCACHE" 
 * 		type="com.ibatis.sqlmap.engine.cache.ehcache.EhCacheController" />
 * </sqlMapConfig>
 * </code>
 * </pre>
 * 
 */
public class EhCacheController implements CacheController {

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

	public static final String CONFIG_LOCATION = "configLocation";

	/**
	 * Default Configure Location
	 */
	public static final String DEFAULT_CONFIG_LOCATION = "/ehcache.xml";

	/**
	 * 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;
	}

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

	/**
	 * Configure a cache controller. Initialize the EH Cache Manager as a
	 * singleton.
	 * 
	 * @param props
	 *            - the properties object continaing configuration information.
	 */
	@Override
	public void configure(Properties props) {
		String configLocation = props.getProperty(CONFIG_LOCATION);
		// if can not found ehcache.xml from configLocaion,
		// use default configure file.
		if (configLocation == null) {
			configLocation = DEFAULT_CONFIG_LOCATION;
		}
		URL url = getClass().getResource(configLocation);
		cacheManager = CacheManager.create(url);
	}
}


这里默认在根目录下获取ehcache.xml文件,可以通过cacheModel配置进行修改。

在SqlMapConfig.xml文件中配置一个别名,作为全局变量,供其余SqlMap使用。
<typeAlias
		alias="EHCACHE"
		type="com.ibatis.sqlmap.engine.cache.ehcache.EhCacheController" />

顺便提一句,要使用缓存注意SqlMapConfig.xml文件中settings节点配置cacheModelsEnabledtrue
	<settings
		cacheModelsEnabled="true"
		useStatementNamespaces="true" 
		... 
	/>

接下来,在SqlMap.xml文件中的cacheModel
	<cacheModel
		id="cache"
		type="EHCACHE">
	...
	</cacheModel>

如果要变更ehcache.xml文件路径为/config/ehcache.xml,可以在上述节点中下入如下代码:
<property name="configLocation" value="/config/ehcache.xml" /> 


然后,就可以通过ehcache.xml控制ehcache缓存了!

举例说明iBatis SqlMap & ehcahce.xml,以免有些兄弟混淆!

以Account类为示例,在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="Account">
	<cacheModel
		id="cache"
		type="EHCACHE">
		<flushInterval
			hours="1" />
		<!-- flush操作,需要指明 Namespace -->
		<flushOnExecute
			statement="Account.create" />
	</cacheModel>
	<typeAlias
		alias="account"
		type="org.zlex.acl.Account" />
	<resultMap
		id="accountMap"
		class="account">
		<result
			property="accountId"
			column="accountId" />
		<result
			property="accountName"
			column="accountName" />
		<result
			property="mail"
			column="mail" />
		<result
			property="realName"
			column="realName" />
		<result
			property="status"
			column="status" />
		<result
			property="lastLoginTime"
			column="lastLoginTime" />
	</resultMap>
	<select
		id="readByAccountName"
		parameterClass="string"
		resultMap="accountMap"
		cacheModel="cache">
		<![CDATA[
			SELECT 
				accountId,
				accountName,
				mail,
				realName,
				status,
				lastLoginTime
			FROM 
				acl_account
			WHERE 
				accountName = #accountName# 
		]]>
	</select>
	<insert
		id="create"
		parameterClass="account">
		<![CDATA[
			INSERT INTO 
				acl_account(
				accountName,
				mail,
				realName,
				status,
				lastLoginTime
				) 
			VALUES (
					#accountName#,
					#mail#,
					#realName#,
					#status#,
					#lastLoginTime#
				)
		]]>
		<selectKey
			resultClass="long"
			keyProperty="accountId">
			<![CDATA[select LAST_INSERT_ID() as id ]]>
		</selectKey>
	</insert>
</sqlMap>

注意:
引用

<select
id="readByAccountName"
parameterClass="string"
resultMap="accountMap"
cacheModel="cache">

这里的cacheModel="cache",对应的在ehcache.xml中就应该是:
	<cache 
		name="Account.cache" 
		maxElementsInMemory="10000" 
		eternal="false"
		maxElementsOnDisk="1000" 
		overflowToDisk="true" 
		timeToIdleSeconds="300"
		/>

因为,我使用了useStatementNamespaces="true"
3
0
分享到:
评论
3 楼 snowolf 2012-10-15  
fanfeiyang 写道
哥们,你这是ibatis自带的高速缓存吧,说实话这种配置用着很方便但是随着配置文件的增加,就会很容易漏写一些清空缓存的配置

自己开发的EhCacheController,非自带。。。。
2 楼 fanfeiyang 2012-10-15  
哥们,你这是ibatis自带的高速缓存吧,说实话这种配置用着很方便但是随着配置文件的增加,就会很容易漏写一些清空缓存的配置
1 楼 programdolt 2012-04-10  
附件在哪里?

相关推荐

    基于改进YOLOv5s的森林烟火检测算法.pdf

    基于改进YOLOv5s的森林烟火检测算法.pdf

    人力资源管理工具绩效考核excel模板01.xlsx

    人力资源管理工具绩效考核excel模板01

    施工班组长绩效考核表.xls

    施工班组长绩效考核表

    57 -营业部经理绩效考核表1.xlsx

    57 -营业部经理绩效考核表1

    XX公司行政部绩效考核指标.xls

    XX公司行政部绩效考核指标

    ant-apache-xalan2-1.9.4-2.el7.x64-86.rpm.tar.gz

    1、文件内容:ant-apache-xalan2-1.9.4-2.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/ant-apache-xalan2-1.9.4-2.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    部门绩效考核表模板(基于KPI以月度为例2).xlsx

    部门绩效考核表模板(基于KPI以月度为例2)

    11-6-质检员绩效考核表(含自动计算、等级评价及任意设置等级).xlsx

    11-6-质检员绩效考核表(含自动计算、等级评价及任意设置等级)

    2024年最新全国河流、湖泊矢量数据(数据权威)

    2024最新全国河流湖泊矢量数据 【数据介绍】 2024年中国河流湖泊数据 一份包含中国境内所有主要河流和湖泊的地理信息数据。 数据格式:Shapefile:广泛使用的GIS数据格式,方便在各类GIS软件中使用。 数据获取:访问OpenStreetMap官网,通过导出工具选择中国区域并下载所需的数据。 使用Geofabrik等第三方网站,可以下载预处理好的中国区域的OSM数据。 数据使用:GIS软件:如QGIS、ArcGIS等,用户可以在这些软件中导入OSM数据进行可视化、分析和编辑。 数据应用: 环境研究:分析河流湖泊的水质变化,研究水资源分布及其环境影响。 城市规划:用于规划城市水系、洪水防控、水资源管理等。 导航和旅游:为河流湖泊的导航和旅游路线规划提供数据支持。 科研:为水文地理研究、生态保护、气候变化等领域提供基础数据。 数据特点: 实时更新:OSM数据由全球用户贡献,具有较高的实时性和更新频率。 开放性:所有数据都在开放许可下发布,允许用户自由使用、修改和分发。 详细性:由于全球志愿者的不断努力,数据细节较为丰富,涵盖了从主要河流湖泊到小型水体的广泛范围。 数据时间2024年5月,shp格式,数据来源OpenStreetMap。 OpenStreetMap(OSM)介绍: 一个开放的、免费的、全球性的地图项目,由全球的志愿者和地图爱好者们共同创建和维护。 OSM的数据包括道路、建筑、公园、河流、湖泊等各类地理信息。由于是由众多志愿者共同编辑,OSM的数据具有很高的实时性和详细程度,特别是在一些活跃的区域,地图数据的更新速度和精度往往超过商业地图服务。 用户可以直接在OSM官网下载地图数据,数据格式主要有OSM XML和PBF等。此外,还有一些第三方网站和工具提供更加便捷的数据下载和处理服务,如Geofabrik、Overpass API等。 OSM的数据可以在各种GIS软件中使用,如QGIS、ArcGIS等。此外,还可以使用Python的OSMnx、GeoPandas等库进行编程处理,或者通过Leaflet、Mapbox等JavaScript库将OSM数据集成到web地图应用中。 OSM的所有数据都在开放许可下发布,允许用户自由使用、修改和分发。这使得OSM成为了许多公共项目、研究机构和商业公司的重要数据来源。

    部门绩效考核评分表.xlsx

    部门绩效考核评分表

    12-11-运输车队长绩效考核表(含自动计算、等级评价).xlsx

    12-11-运输车队长绩效考核表(含自动计算、等级评价)

    ant-javadoc-1.9.4-2.el7.x64-86.rpm.tar.gz

    1、文件内容:ant-javadoc-1.9.4-2.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/ant-javadoc-1.9.4-2.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    springboot整合 freemarker方法

    springboot整合 freemarker方法

    apache-commons-codec-1.8-7.el7.x64-86.rpm.tar.gz

    1、文件内容:apache-commons-codec-1.8-7.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/apache-commons-codec-1.8-7.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    (数据权威)全国旅游抽样调查数据

    《旅游抽样调查资料》是反映入境游客在华(内地)花费和国内居民国内旅游情况的资料性年刊,分为上下两篇。 上篇为在华(内地)停留时间在3个月以内的入境游客抽样调查资料,由综合分析报告和调查分类数据两部分组成,分类数据包括:入境游客的主要特征,入境外国人、港澳台同胞的花费水平和花费构成、在境内的停留时间以及入境次数、流向和对住宿单位的选择等。 下篇为国内旅游抽样调查资料,汇集了对城镇居民和农村居民的国内旅游抽样调查结果,共分为四个部分:第一部分为综合分析报告;第二部分为国内旅游出游及花费情况;第三部分为城镇居民国内旅游抽样调查分类数据;第四部分为农村居民国内旅游抽样调查分类数据。

    二代身份证信息读取(vfp8.0)

    1、表单界面,身份证信息保存在dbf表中,供vfp应用使用,可导出为xls电子表格。 2、提供了身份证过期校验和查询功能。

    人事行政主管绩效考核评分表.xls

    人事行政主管绩效考核评分表

    08 -大堂副理绩效考核表1.xlsx

    08 -大堂副理绩效考核表1

    apr-1.4.8-7.el7.x64-86.rpm.tar.gz

    1、文件内容:apr-1.4.8-7.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/apr-1.4.8-7.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    ComponentNameError解决办法.md

    ComponentNameError解决办法.md

Global site tag (gtag.js) - Google Analytics