`
lyy3323
  • 浏览: 88080 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

抄袭ibatis缓存设计。自实现缓存设计

阅读更多
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
分享到:
评论
1 楼 lizhongyi199 2012-08-01  
源码不全啊,能不能上传完整看看。

相关推荐

    iBATIS缓存

    iBATIS的缓存实现主要依赖于Java的Map接口,通过自定义的缓存实现类(如DefaultCache)进行管理。在处理并发访问时,iBATIS可能会使用到线程安全的数据结构,如ConcurrentHashMap,以保证多线程环境下的安全性。 总...

    iBATIS缓存介绍

    理论上,Web分层设计的各个层都可以有缓存,Web中的任何对象都可以成为缓存的对象。例如: - **HTTP请求结果的缓存**:如页面数据或API响应。 - **浏览器缓存**:客户端的缓存机制。 - **代理缓存**:位于客户端与...

    iBATIS缓存的使用方法

    ### iBATIS缓存的使用方法 在数据库访问框架iBATIS中,缓存机制是一项重要的功能,它能够显著提高应用程序的性能。本文将详细介绍iBATIS中的缓存使用方法,包括缓存模型的配置、不同类型的缓存控制器以及如何在SQL...

    ibatis缓存介绍 - 勇泽 - 博客园.mht

    ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园

    解决IBatis缓存动态字段问题

    ### 解决IBatis缓存动态字段问题 #### 背景与问题描述 在使用IBatis框架处理数据库操作时,可能会遇到动态数据表名、动态字段名的情况。这种情况下,由于IBatis的缓存机制,可能导致字段找不到的问题。具体表现为...

    ibatis-缓存使用示例

    对于源码的阅读,可以更直观地了解iBATIS如何实现缓存的存储和检索,这对于调试和优化系统性能非常有帮助。同时,工具的熟练运用,如使用IDEA的Debug模式跟踪代码执行,可以帮助更好地理解和调试缓存逻辑。 总之,...

    ibatis 缓存配置策略

    iBatis 缓存配置策略是提高数据库查询性能的关键手段之一。iBatis 提供了本地缓存机制,用于存储查询结果集,减少不必要的数据库访问。以下是对iBatis缓存配置策略的深入解析: 首先,iBatis 的 Cache 键(key)是...

    Java ibatis缓存技术

    - **type**:指定缓存的实现类型。常见的类型包括“MEMORY”、“LRU”、“FIFO”等。 - “MEMORY”(`com.ibatis.sqlmap.engine.cache.memory.MemoryCacheController`):使用软引用管理缓存中的对象,当内存紧张时...

    Java_ibatis缓存技术

    - **自定义缓存实现**:若系统需求特殊,可以自定义缓存实现类,通过`@CacheNamespaceRef`注解引用。 - **缓存刷新**:当数据库数据更新时,需要及时清理缓存以保持数据一致性。可以通过`flushCache="true"`属性来...

    iBATIS缓存介绍[借鉴].pdf

    iBATIS,作为一个流行的数据访问框架,也提供了缓存功能来优化数据库查询。本文将详细介绍iBATIS缓存的概念、类型以及配置方法。 一.缓存介绍 缓存,简单来说,是为了减少对数据库的频繁访问,将常用数据存储在...

    ibatis 缓存 - 24小时学习网.mht

    ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网

    ibatis_数据缓存

    iBatis 数据缓存机制是提高数据库访问性能的重要手段,它允许将查询结果存储在内存中,以便后续相同查询能够快速获取数据,而无需每次都执行SQL查询。在深入理解iBatis的Cache概念之前,首先需要知道iBatis是一个轻...

    ibatis 数据缓存.pdf

    ibatis 数据缓存,讨论了ibatis 数据缓存方面的概念,即用法,用到ibatis 数据缓存的可以参考一下

    ibatis 框架原理实现

    **Ibatis 框架原理实现** Ibatis 是一个优秀的持久层框架,它允许开发者将SQL语句直接写在XML配置文件中,从而避免了Java代码与SQL的耦合,提高了开发效率。在这个自己编写的Ibatis框架实现中,我们可以看到类似的...

    spring+ibatis+oracle分页缓存源码

    总的来说,"spring+ibatis+oracle分页缓存源码"项目展示了如何在Spring管理的环境中,利用iBatis和Oracle数据库实现高效的数据分页和缓存策略。通过理解和实践这些技术,开发者可以构建出更加健壮、响应快速的Web...

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

    源码中`org.apache.ibatis.cache.Cache`接口定义了缓存的基本操作,而具体的缓存实现如`org.apache.ibatis.cache.impl.PerpetualCache`则实现了缓存的存储和读取。 通过阅读和理解iBatis的源码,我们可以更深入地...

    ibatis demo,ibatis例子,ibatis示例

    通过这个demo,你可以了解到Ibatis的基本用法,如何编写SQL映射文件,如何设计Mapper接口,以及如何在Java代码中调用这些接口执行数据库操作。同时,也能掌握Ibatis的动态SQL特性,以及如何配合Spring进行更高效的...

    iBATIS_DAO事务管理实现

    为了实现这一点,框架采用了特定的设计模式——桥梁模式(Bridge Pattern),来解耦事务管理和具体实现。 - **类结构**: - **DaoTransactionManager接口**: 提供了事务管理的基本方法。 - **DaoTransaction接口*...

Global site tag (gtag.js) - Google Analytics