1.较为简单的缓存机制,不支持分布式缓存。
2.目前只实现了memory形式。如有扩展,请自实现fifo,lru等形式。
3.为了缓存机制过于复杂,暂不支持配置文件形式。以后会用第三方组件代替,没必要在此处下太大功夫。
4.增加了factory生成相应的cachemodel。保证单例。
5.使用方式:
5.1factory通过加载指定的缓存机制生产cachemodel(缓存包装类),每种cachecontrol对应一个cachemodel(单例)。
5.2通过操作cachemodel(内部包含了cachecontrol接口,解耦)来进行实际的动作。
核心code.
package com.common.utils.cacheUtils.myCache;
import java.util.Properties;
import org.apache.log4j.Logger;
/**
* 缓存模式包装类,公用的设计均写在此处。(日志,控制时间等等。) <br>
*
* @author yzx
* @see
* @since
*/
public class CacheModel {
private static Logger logger = Logger.getLogger(CacheModel.class);
private CacheControl cacheControl;
private static final int MAX_OBJECT_LOG_SIZE = 100;
private static final long NO_FLUSH_INTERVAL = -99999;
private String id;
private boolean readOnly;
private boolean serialize;
private long lastFlush;
private long flushInterval;
private long flushIntervalSeconds;
private CacheModel() {
}
/**
* 缓存模式初始化
*
* @param controllerClassName
*/
protected CacheModel(String controllerClassName) {
try {
this.flushInterval = NO_FLUSH_INTERVAL;
this.flushIntervalSeconds = NO_FLUSH_INTERVAL;
this.lastFlush = System.currentTimeMillis();
cacheControl = (CacheControl) Class.forName(controllerClassName).newInstance();
} catch (Exception e) {
logger.error("缓存控制器包装类初始化失败!" + e.getMessage());
throw new RuntimeException("缓存控制器包装类初始化失败!");
}
}
public void configure(Properties props) {
cacheControl.configure(props);
}
/**
* Clears the cache
*/
public void flush() {
synchronized (this) {
cacheControl.flush(this);
lastFlush = System.currentTimeMillis();
}
}
public Object getObject(Object key) {
Object value = null;
// 暂不用,若使用,需要同步
// if (flushInterval != NO_FLUSH_INTERVAL && System.currentTimeMillis() - lastFlush > flushInterval) {
// flush();
// }
value = cacheControl.getObject(this, key);
return value;
}
public void putObject(Object key, Object value) {
synchronized (this) {
cacheControl.putObject(this, key, value);
}
}
public Object removeObject(Object key) {
synchronized (this) {
return cacheControl.removeObject(this, key);
}
}
public static Logger getLogger() {
return logger;
}
public static void setLogger(Logger logger) {
CacheModel.logger = logger;
}
// public CacheControl getCacheControl() {
// return cacheControl;
// }
//
// public void setCacheControl(CacheControl cacheControl) {
// this.cacheControl = cacheControl;
// }
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public boolean isReadOnly() {
return readOnly;
}
public void setReadOnly(boolean readOnly) {
this.readOnly = readOnly;
}
public boolean isSerialize() {
return serialize;
}
public void setSerialize(boolean serialize) {
this.serialize = serialize;
}
public long getLastFlush() {
return lastFlush;
}
public void setLastFlush(long lastFlush) {
this.lastFlush = lastFlush;
}
public long getFlushInterval() {
return flushInterval;
}
public void setFlushInterval(long flushInterval) {
this.flushInterval = flushInterval;
}
public long getFlushIntervalSeconds() {
return flushIntervalSeconds;
}
public void setFlushIntervalSeconds(long flushIntervalSeconds) {
this.flushIntervalSeconds = flushIntervalSeconds;
}
public static int getMaxObjectLogSize() {
return MAX_OBJECT_LOG_SIZE;
}
public static long getNoFlushInterval() {
return NO_FLUSH_INTERVAL;
}
}
package com.common.utils.cacheUtils.myCache;
import java.util.Properties;
/**
* Description:缓存自实现接口 <br>
*
* @author yzx
* @see
* @since
*/
public interface CacheControl {
/**
* 清空缓存
*
* @param cacheModel
*/
public void flush(CacheModel cacheModel);
/**
* 获取缓存值
*
* @param cacheModel
* @param key
* @return
*/
public Object getObject(CacheModel cacheModel, Object key);
/**
* 移除某个缓存值
*
* @param cacheModel
* @param key
* @return
*/
public Object removeObject(CacheModel cacheModel, Object key);
/**
* 更新缓存
*
* @param cacheModel
* @param key
* @param value
*/
public void putObject(CacheModel cacheModel, Object key, Object value);
/**
* 为配置文件做扩展用,暂不用(不想在此处做的太复杂。将来会考虑用第三方组件)
*
* @param props
*/
@Deprecated
public void configure(Properties props);
}
- 大小: 49.3 KB
分享到:
相关推荐
iBATIS的缓存实现主要依赖于Java的Map接口,通过自定义的缓存实现类(如DefaultCache)进行管理。在处理并发访问时,iBATIS可能会使用到线程安全的数据结构,如ConcurrentHashMap,以保证多线程环境下的安全性。 总...
理论上,Web分层设计的各个层都可以有缓存,Web中的任何对象都可以成为缓存的对象。例如: - **HTTP请求结果的缓存**:如页面数据或API响应。 - **浏览器缓存**:客户端的缓存机制。 - **代理缓存**:位于客户端与...
### iBATIS缓存的使用方法 在数据库访问框架iBATIS中,缓存机制是一项重要的功能,它能够显著提高应用程序的性能。本文将详细介绍iBATIS中的缓存使用方法,包括缓存模型的配置、不同类型的缓存控制器以及如何在SQL...
ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园
### 解决IBatis缓存动态字段问题 #### 背景与问题描述 在使用IBatis框架处理数据库操作时,可能会遇到动态数据表名、动态字段名的情况。这种情况下,由于IBatis的缓存机制,可能导致字段找不到的问题。具体表现为...
对于源码的阅读,可以更直观地了解iBATIS如何实现缓存的存储和检索,这对于调试和优化系统性能非常有帮助。同时,工具的熟练运用,如使用IDEA的Debug模式跟踪代码执行,可以帮助更好地理解和调试缓存逻辑。 总之,...
iBatis 缓存配置策略是提高数据库查询性能的关键手段之一。iBatis 提供了本地缓存机制,用于存储查询结果集,减少不必要的数据库访问。以下是对iBatis缓存配置策略的深入解析: 首先,iBatis 的 Cache 键(key)是...
- **type**:指定缓存的实现类型。常见的类型包括“MEMORY”、“LRU”、“FIFO”等。 - “MEMORY”(`com.ibatis.sqlmap.engine.cache.memory.MemoryCacheController`):使用软引用管理缓存中的对象,当内存紧张时...
- **自定义缓存实现**:若系统需求特殊,可以自定义缓存实现类,通过`@CacheNamespaceRef`注解引用。 - **缓存刷新**:当数据库数据更新时,需要及时清理缓存以保持数据一致性。可以通过`flushCache="true"`属性来...
iBATIS,作为一个流行的数据访问框架,也提供了缓存功能来优化数据库查询。本文将详细介绍iBATIS缓存的概念、类型以及配置方法。 一.缓存介绍 缓存,简单来说,是为了减少对数据库的频繁访问,将常用数据存储在...
ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网
iBatis 数据缓存机制是提高数据库访问性能的重要手段,它允许将查询结果存储在内存中,以便后续相同查询能够快速获取数据,而无需每次都执行SQL查询。在深入理解iBatis的Cache概念之前,首先需要知道iBatis是一个轻...
ibatis 数据缓存,讨论了ibatis 数据缓存方面的概念,即用法,用到ibatis 数据缓存的可以参考一下
**Ibatis 框架原理实现** Ibatis 是一个优秀的持久层框架,它允许开发者将SQL语句直接写在XML配置文件中,从而避免了Java代码与SQL的耦合,提高了开发效率。在这个自己编写的Ibatis框架实现中,我们可以看到类似的...
总的来说,"spring+ibatis+oracle分页缓存源码"项目展示了如何在Spring管理的环境中,利用iBatis和Oracle数据库实现高效的数据分页和缓存策略。通过理解和实践这些技术,开发者可以构建出更加健壮、响应快速的Web...
源码中`org.apache.ibatis.cache.Cache`接口定义了缓存的基本操作,而具体的缓存实现如`org.apache.ibatis.cache.impl.PerpetualCache`则实现了缓存的存储和读取。 通过阅读和理解iBatis的源码,我们可以更深入地...
通过这个demo,你可以了解到Ibatis的基本用法,如何编写SQL映射文件,如何设计Mapper接口,以及如何在Java代码中调用这些接口执行数据库操作。同时,也能掌握Ibatis的动态SQL特性,以及如何配合Spring进行更高效的...
为了实现这一点,框架采用了特定的设计模式——桥梁模式(Bridge Pattern),来解耦事务管理和具体实现。 - **类结构**: - **DaoTransactionManager接口**: 提供了事务管理的基本方法。 - **DaoTransaction接口*...