缓存初解(四)---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"
		...
	/>

如果要变更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"

时间: 2024-11-10 17:14:32

缓存初解(四)---Ibatis的缓存配置+Ehcache的相关文章

缓存初解(三)---Spring3.0基于注解的缓存配置+Ehcache和OScache

本文将构建一个普通工程来说明spring注解缓存的使用方式,关于如何在web应用中使用注解缓存,请参见: Spring基于注解的缓存配置--web应用实例 一.简介 在spring的modules包中提供对许多第三方缓存方案的支持,包括: EHCache OSCache(OpenSymphony) JCS GigaSpaces JBoss Cache 等等. 将这些第三方缓存方案配置在spring中很简单,网上有许多介绍,这里只重点介绍如何配置基于注解的缓存配置. 本文将通过例举EHCache和

缓存初解(五)---SpringMVC基于注解的缓存配置--web应用实例

之前为大家介绍了如何使用spring注解来进行缓存配置 (EHCache 和 OSCache)的简单的例子,详见 Spring基于注解的缓存配置--EHCache AND OSCache 现在介绍一下如何在基于注解springMVC的web应用中使用注解缓存,其实很简单,就是将springMVC配置文件与缓存注解文件一起声明到context中就OK了. 下面我就来构建一个基于spring注解小型的web应用,这里我使用EHCache来作为缓存方案 jar依赖: ehcache-core-1.7.

Mybatis框架学习(四)—查询缓存与spring的整合开发

1       项目整体目录 2       查询缓存 2.1     缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题. 2.1    mybatis持久层缓存 mybatis提供一级缓存和二级缓存 mybatis一级缓存是一个SqlSession级别,sqlsession只能访问自己的一级缓存的数据,二级缓存是跨sqlSession,是mapper级别的缓存,对于mappe

spring整合ehcache 注解实现查询缓存,并实现实时缓存更新或删除

写在前面:上一篇博客写了spring cache和ehcache的基本介绍,个人建议先把这些最基本的知识了解了才能对今天主题有所感触.不多说了,开干! 注:引入jar <!-- 引入ehcache缓存 --> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.8.3</version&g

mybatis 源码分析(四)一二级缓存分析

本篇博客主要讲了 mybatis 一二级缓存的构成,以及一些容易出错地方的示例分析: 一.mybatis 缓存体系 mybatis 的一二级缓存体系大致如下: 首先当一二级缓存同时开启的时候,首先命中二级缓存: 一级缓存位于 BaseExecutor 中不能关闭,但是可以指定范围 STATEMENT.SESSION: 整个二级缓存虽然经过了很多事务相关的组件,但是最终是落地在 MapperStatement 的 Cache 中(Cache 的具体实例类型可以在 mapper xml 的 cach

Varnish缓存机制详细介绍及简单配置

Varnish是一款高性能的开源HTTP加速器,其主要用来做为反向代理中的缓存服务器使用,但其实Varnish本身也是具有反向代理功能的,但在创建连接和维持连接上,与Nginx相比差距很大,现在有一个很流行的架构就是前端用Nginx作为反向代理,后面加Varnish缓存服务器为Web服务加速 在将Varnish前先谈谈我们的浏览器缓存机制,现在的浏览器基本都具有缓存功能,它能将我们以前访问过的静态内容和可进行缓存的动态内容缓存再本地,而后在下次访问相同资源时,如果可以确认Server端的资源未发

Thinkphp入门 四 —布局、缓存、系统变量 (48)

原文:Thinkphp入门 四 -布局.缓存.系统变量 (48) [控制器操作方法参数设置] http://网址/index.php/控制器/操作方法 [页面跳转] [变量调节器] Smarty变量调节器 TP变量调节器:普通的php函数 (count  strlen   str_replace) 定义:前者的输出,是后者的输入 [子模板包含] 当前模块彼此包含 <include  file=”模板名称”  /> [使用布局layout] 1. 开启布局,配置变量信息config.php 2.

java之ibatis数据缓存

使用IBatis作数据缓存 1.SqlMapConfig.xml中<settingscacheModelsEnabled="true" //设置为trueenhancementEnabled="true"lazyLoadingEnabled="true"............./> 2.cacheModel cacheModel的属性值等于指定的cacheModel元素的name属性值.属性cacheModel定义查询mapped

ibatis的缓存机制

Cache        在特定硬件基础上(同时假设系统不存在设计上的缺漏和糟糕低效的SQL 语句)Cache往往是提升系统性能的最关键因素).        相对Hibernate 等封装较为严密的ORM 实现而言(因为对数据对象的操作实现了较为严密的封装,可以保证其作用范围内的缓存同步,而ibatis 提供的是半封闭的封装实现,因此对缓存的操作难以做到完全的自动化同步).        ibatis 的缓存机制使用必须特别谨慎.特别是flushOnExecute 的设定,需要考虑到所有可能引