`

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  
附件在哪里?

相关推荐

    spring+ibatis+ehcache整合例子

    在IT行业中,Spring、iBatis和Ehcache是三个非常重要的开源框架,它们分别用于企业级应用的依赖注入、数据库操作和缓存管理。这个"spring+ibatis+ehcache整合例子"是一个完整的示例项目,展示了如何将这三个框架无缝...

    spring MVC+ibatis+ehcache开发包集合

    自己项目的开发包集合,其中包括:缓存处理ehcache相关jar,spring MVC4.0 jar,ehcache依赖jar,以及其他jar(图像处理thumbnailator-0.4.2),包虽然不是很新但可用。实际使用时找包较为麻烦,现在整理出来,希望...

    ibatis —— docs.zip

    MyBatis生成器(MBG)是MyBatis MyBatis 和iBATIS的代码生成器。它将为MyBatis的所有版本以及版本2.2.0之后的iBATIS生成代码。它将内省一个数据库表(或多个表),并将生成可用于访问表的工件。这减轻了设置对象和...

    扩展 iBatis 以透明支持多种数据库

    标题 "扩展 iBatis 以透明支持多种数据库" 指的是在 iBatis 数据库持久层框架的基础上,通过一定的编程技巧和配置方法,使其能够灵活地适应不同的数据库系统,无需对应用程序代码进行大规模修改。iBatis 是一个轻量...

    Spring高版本对ibatis的支持

    最近想在最新的Spring5.0中集成ibatis(不是mybatis),发现已经不在支持SqlmapClientTemplate和SqlmapClientFactoryBean,于是搞了这个工具jar来进行支持如下配置 ...

    MyEclipse上自动生成dao和实体的插件——ibatis

    Ibator,全称为"Ibatis Auto Generator for Eclipse",是Ibatis官方提供的一个扩展,它可以在Eclipse或MyEclipse环境中自动化创建DAO层和实体类。通过简单的配置,Ibator可以根据数据库表的信息自动生成相应的Java...

    ibatis资料整理.zip

    10. **插件扩展**:Ibatis允许开发者创建自定义插件,如PageHelper分页插件,以实现特定功能或优化性能。 11. **最佳实践**:在实际应用中,应合理规划Mapper接口和XML文件,避免过度复杂的SQL,同时注意优化事务...

    spring-ibatis-ext-plugin.1.0.0 扩展ibaits原生SQL

    在多数情况下不及特定数据库支持的物理分页,而hibernate的分页则是直接组装sql,充分利用了特定数据库的分页机制,效率相 对较高。本文讲述的就是如何在不重新编译ibatis源码的前提下,为ibatis引入hibernate式的...

    ibatis教程,ibatis帮助文档

    一、iBATIS的核心要素——SQL Maps SQL Maps是iBATIS的核心,通过XML文件定义了Java对象与SQL语句之间的映射,大大减少了数据库操作的代码量。这种映射方式使得SQL语句的管理更加灵活,也更易于理解和维护。 二、...

    ibatis demo,ibatis例子,ibatis示例

    8. **插件支持**:Ibatis允许开发者编写自定义插件,通过拦截器模式对SqlSession或Executor的行为进行扩展,如性能监控、日志记录等。 在ibatis demo中,我们可能还会看到如何配置Spring与Ibatis的集成,以便利用...

    Spring与iBATIS的集成

    Spring与iBATIS的集成 iBATIS似乎已远离众说纷纭的OR框架之列,通常人们对非常流行的Hibernate情有独钟。但正如Spring A Developer's Notebook作者Bruce Tate 和Justin Gehtland所说的那样,与其他的OR框架相比...

    传智播客ibatis教程_ibatis优点总结

    本文将深入探讨其中一个流行的选择——iBATIS,以及其在传智播客教程中的优点总结。 iBATIS,全称为“互联网应用程序基础工具包”(Internet Basics for Architecture with Transactions and SQL),是由Apache ...

    ibatis总结 ibatis ibatis ibatis ibatis

    Ibatis 是一款轻量级的Java持久层框架,它允许开发者将SQL语句与Java代码分离,从而使得数据库访问更加灵活、易于维护。本篇文章将深入探讨Ibatis的核心概念、最佳实践以及与其他框架如Struts和Spring的整合。 1. ...

    ibatis_with_memcached

    3. **分布式支持**:Memcached支持分布式部署,可以应对高并发场景,保证服务的稳定性和可扩展性。 4. **缓存策略**:Ibatis与Memcached集成后,可以设置不同的缓存策略,如LRU(最近最少使用)、FIFO(先进先出)等...

    ibatis学习完整实例,例子

    《全面解析Ibatis实战教程——基于ibatistest2项目》 Ibatis,作为一个轻量级的持久层框架,以其灵活、易用的特点在Java开发领域广泛应用。本教程旨在通过一个完整的实例——"ibatistest2"项目,帮助开发者深入理解...

    ibatis.rar

    《深入理解iBatis——基于“ibatis.rar”教学资源》 iBatis,作为一款优秀的数据持久层框架,以其轻量级、易用性以及灵活性,在Java开发领域备受推崇。本教学视频全面覆盖了iBatis的基础知识,旨在帮助初学者快速...

    ibatis2.0中文API

    同时,对于复杂的业务场景,iBATIS支持动态SQL,使得在映射文件中可以编写条件语句,根据对象状态动态生成执行的SQL片段。 最后,iBATIS 2.0的核心API主要包括SqlMapConfig.xml配置文件、SqlMapClient接口及其实现...

    ibatis源码,ibatis源码 ibatis源码 ibatis源码

    iBatis支持JDBC和Spring两种事务管理方式。在源码中,`org.apache.ibatis.transaction.jdbc.JdbcTransaction`和`org.apache.ibatis.transaction.managed.ManagedTransaction`分别对应JDBC和Spring的事务管理。 十、...

    ibatis课件

    这组“iBatis课件”是关于Java编程领域中的一个知名持久层框架——iBatis的学习资源。iBatis作为一个轻量级的框架,它允许开发者将SQL语句直接嵌入到Java代码中,解决了传统的JDBC繁琐的代码编写问题,提高了开发...

Global site tag (gtag.js) - Google Analytics