`
jwen
  • 浏览: 63215 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

ibatis基础上添加memcached缓存

 
阅读更多
在ibatis源码基础上修改,增加对memcached支持,通过配置IBatis的xml文件即可实现memcached细粒度话缓存,使用简单,缓存效果好。 spring下首先初始化MemcachedManager对象,或者通过程序初始化也一样,不要用ibatis官方的jar包,否则会冲突
<bean class="com.ibatis.sqlmap.engine.cache.memcached.memcachedManager" lazy-init="false"

    init-method="init" destroy-method="closePool">

    <property name="serverlist">

        <value>

        192.168.0.1:11111, 192.168.0.2:11111

        </value>

    </property>

    <property name="initConn" value="5">

    </property>

    <property name="minConn" value="5">

    </property>

    <property name="maxConn" value="200">

    </property>

Unknown end tag for </bean>



然后配置sqlMapConfig.xml文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"

    "http://ibatis-with-memcached.googlecode.com/files/sql-map-config-2.dtd"> #注意这里,不用官方的,这个dtd文件加了个新属性databaseUrl,区分不同数据库的缓存对象




<sqlmapconfig>

    <properties resource="cache_config.properties">

    </properties>

    <settings

        cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" maxRequests="256" maxSessions="256" maxTransactions="150" useStatementNamespaces="true" databaseUrl="数据库名或地址" #新增加的属性 />

ibatis的xml文件:Albums.xml #创建缓存model

<cachemodel type="MEMCACHED" id="albumsCache">

    <flushinterval hours="12">

    </flushInterval >

    <flushonexecute statement="albums.save">

    </flushOnExecute >

    <flushonexecute statement="albums.update">

    </flushOnExecute >

    <flushonexecute statement="albums.delete">

    </flushOnExecute >

    <property name="pk" value="id">

    </property>

    #可以根据主键进行缓存,可以设置为空,不能不设

    <property name="groupField" value="accId">

    </property>

    #可以根据组(比如用户id)进行缓存,更加细粒度化,可以设置为空,不能不设

Unknown end tag for </cachemodel>

#加入缓存

<select id="findall" parameterClass="albumsObj" resultClass="albumsObj" cacheModel="albumsCache">

    Select ……from albums where accId=1

</select>

<select id="load" parameterClass="albumsObj" resultClass="albumsObj" cacheModel="albumsCache">

    Select ……from albums where id=1

</select>

 

#删除对象,删除缓存

<delete id="delete" parameterClass="albumsObj">

    delete from albums where id=1 and accId=1 #(加上accId可以删除分组缓存)

</delete>

package com.ibatis.sqlmap.engine.cache.memcached; 
 
import java.io.Serializable; 
import java.util.Collection; 
import java.util.Date; 
import java.util.Map; 
 
import org.apache.log4j.Logger; 
 
import com.danga.MemCached.MemCachedClient; 
import com.danga.MemCached.SockIOPool; 
 
 
public class MemcachedManager { 
 
        private static Logger logger = Logger.getLogger(MemcachedManager.class); 
 
        private static String memcachedDomain = "IBATIS_CACHED"; // memcached 域名 
 
        private String serverlist; 
 
        private static MemCachedClient mcc = null; 
 
        private SockIOPool pool = null; 
 
        private int initConn = 5; 
 
        private int minConn = 5; 
 
        private int maxConn = 50; 
 
         
        public void init() { 
                if (mcc != null) 
                        return; 
 
                logger.info("Initializing ibatis memcached start."); 
                if (pool == null) { 
                        try { 
                                pool = SockIOPool.getInstance(memcachedDomain); 
                                pool.setServers(serverlist.split(",")); 
                                if (!pool.isInitialized()) { 
                                        pool.setInitConn(initConn); 
                                        pool.setMinConn(minConn); 
                                        pool.setMaxConn(maxConn); 
                                        pool.setMaintSleep(30); 
                                        pool.setNagle(false); 
                                        pool.setSocketTO(60 * 60); 
                                        pool.setSocketConnectTO(0); 
                                        pool.initialize(); 
                                } 
                        } catch (Exception ex) { 
                                logger.error(ex.getMessage()); 
                        } 
                } 
 
                if (mcc == null) { 
                        mcc = new MemCachedClient(memcachedDomain); 
                        mcc.setCompressEnable(false); 
                        mcc.setCompressThreshold(0); 
                } 
                logger.info("Initializing youxigu Memcached ok!"); 
        } 
 
         
        public void closePool() { 
                pool.shutDown(); 
                mcc = null; 
                pool = null; 
                logger.info("Ibatis memcached pool closed"); 
        } 
 
         
        public static boolean set(Object key, Serializable obj) { 
                logger.debug("set key:" + getKey(key) + ", value:" + obj); 
                try { 
                        return mcc.set(getKey(key), obj); 
                } catch (Exception e) { 
                        logger.error("Pool set error!"); 
                        e.printStackTrace(); 
                } 
                return false; 
        } 
 
         
        public static boolean set(Object key, Serializable obj, long cacheTime) { 
                try { 
                        return mcc.set(getKey(key), obj, new Date(cacheTime)); 
                } catch (Exception e) { 
                        logger.error("Pool set error!"); 
                        e.printStackTrace(); 
                } 
                return false; 
        } 
 
         
        public static void replace(int key, Serializable value, long cacheTime) { 
                try { 
                        mcc.replace(getKey(key), value, new Date(cacheTime)); 
                } catch (Exception e) { 
                        logger.error(" pool set error!"); 
                } 
        } 
 
         
        public static Object get(Object key) { 
                Object result = null; 
                String realkey = getKey(key); 
                try { 
                        result = mcc.get(realkey); 
                } catch (Exception e) { 
                        e.printStackTrace(); 
                } 
                logger.debug("get key:" + getKey(key) + ", value:" + result); 
                return result; 
        } 
 
         
        public static void setCounter(Object key, long count) { 
                try { 
                        mcc.storeCounter(getCountKey(key), count); 
                } catch (Exception e) { 
                        logger.error("Pool setCounter error!"); 
                } 
        } 
 
         
        public static void addCounter(Object key) { 
                if(mcc.get(getCountKey(key))==null){ 
                        mcc.storeCounter(getCountKey(key), 0); 
                } 
                try { 
                        mcc.incr(getCountKey(key)); 
                } catch (Exception e) { 
                        logger.error("Pool setCounter error!"); 
                } 
        } 
 
         
        public static void decreaseCounter(Object key) { 
                try { 
                        mcc.decr(getCountKey(key)); 
                } catch (Exception e) { 
                        logger.error("Pool setCounter error!"); 
                } 
        } 
 
         
        public static void addCounter(Object key, long addValue) { 
                try { 
                        mcc.incr(getCountKey(key), addValue); 
                } catch (Exception e) { 
                        logger.error(" pool setCounter error!"); 
                } 
        } 
 
         
        public static long getCounter(Object key) { 
                long result = 0; 
                try { 
                        result = mcc.getCounter(getCountKey(key)); 
                } catch (Exception e) { 
                        logger.error(e.getMessage()); 
                } 
                return result; 
        } 
 
         
        public static boolean delete(Object key) { 
                try { 
                        return mcc.delete(getKey(key)); 
                } catch (Exception e) { 
                        logger.error(e.getMessage()); 
                } 
                return false; 
        } 
 
         
        public static long deleteCounter(Object key) { 
                try { 
                        return mcc.decr(getCountKey(key)); 
                } catch (Exception e) { 
                        logger.error(" pool setCounter error!"); 
                } 
                return 0;  
        } 
 
         
        public static void flushAll() { 
                mcc.flushAll(); 
        } 
         
        @SuppressWarnings("unchecked") 
        public static long size(){ 
                long size=0L; 
                Map<String,Map<String,String>> status=mcc.statsItems(); 
                Collection<Map<String,String>> values=status.values(); 
                for (Map<String,String> state:values) { 
                        String num=state.get("items:1:number"); 
                        if(num==null) 
                                continue; 
                         
                        size+=Long.parseLong(state.get("items:1:number")); 
                } 
                return size; 
        } 
 
         
        private static String getKey(Object key) { 
                return memcachedDomain + "@" + key; 
        } 
 
        private static String getCountKey(Object key) { 
                return memcachedDomain + "@" + key + "_count"; 
        } 
 
         
        public void setServerlist(String serverlist) { 
                this.serverlist = serverlist; 
        } 
 
         
        public void setInitConn(int initConn) { 
                this.initConn = initConn; 
        } 
 
         
        public void setMinConn(int minConn) { 
                this.minConn = minConn; 
        } 
 
         
        public void setMaxConn(int maxConn) { 
                this.maxConn = maxConn; 
        } 
 
         
        public void setMemcachedDomain(String memcachedKey) { 
                MemcachedManager.memcachedDomain = memcachedKey; 
        } 
} 
分享到:
评论

相关推荐

    ibatis_with_memcached

    本项目"ibatis_with_memcached"就是关于如何将Ibatis与Memcached集成,实现高效的数据库缓存策略的实例。 Ibatis是一个基于Java的SQL映射框架,它允许开发者编写SQL语句并与Java对象进行绑定,从而避免了传统的JDBC...

    ibatis memcached 整合 源码 文档

    1. 添加依赖:在项目中引入Memcached的Java客户端库,如spymemcached,同时确保iBatis的相关库也已添加。 2. 配置iBatis:在iBatis的配置文件中,定义一个Cache配置,指定使用Memcached作为缓存机制。例如: ```xml...

    ibatis memcached

    标题中的“ibatis memcached”指的是将MyBatis(原名iBATIS)这个流行的Java持久层框架与Memcached这个分布式内存对象缓存系统相结合,实现数据的高效缓存管理。这种集成允许开发者将MyBatis的二级缓存功能扩展到...

    基于 Spring和 Memcached的 iBATIS二级 缓存的研究与应用 (2009年)

    高性能是J2EE应用程序追求的目标,在特定硬件基础上,数据...在对 iBATIS的缓存支持情况进行了介绍和研究的基础上,并结合Spring框架和iBATIS,使用Memcached对iBATIS二级缓存进行了新的实现,使应用的性能得到了很大的提升.

    ibatis与memchaced使用说明

    为了更好地利用memcached作为ibatis的二级缓存,我们需要进行相应的配置。以下是具体的配置步骤: ##### 所需jar包: - `java_memcached-release_2.0.1.jar`: 提供了memcached客户端支持。 - `apache-commo-lang....

    Maven+spring+ibatis+struts2.0+MQ+Memcached 项目构建

    【标题】"Maven+Spring+Ibatis+Struts2.0+MQ+Memcached 项目构建"涉及了多个核心的Java开发技术和框架,这些技术的集成应用在现代企业级应用开发中非常常见。让我们逐一深入理解这些技术及其在项目中的作用。 1. ...

    Ibatis.net 分页

    同时,考虑缓存策略,比如使用Redis或Memcached等缓存系统,减少对数据库的访问次数。 此外,还要注意防止SQL注入,尤其是在动态SQL中,应使用参数化查询或预编译语句,避免直接拼接用户输入的字段。 总结起来,...

    第三方缓存整合mybatis.rar

    4. **配置MyBatis缓存**:MyBatis支持自定义缓存实现,我们需要创建一个实现了`org.apache.ibatis.cache.Cache`接口的类,这个类将负责与Redis交互,进行数据的存取。在MyBatis的配置文件中,将这个自定义缓存类注册...

    大数据功能模块概要设计-V1.1Word版.docx

    - **基础类库**:如Apache Commons扩展基础类,JSON库如json-lib,单元测试工具JUnit,MVC框架如Struts2或Spring MVC,ORM框架如iBatis或Hibernate。 3. **选型**: - **中间件**:商业产品如WebLogic、WebSphere...

    JavaEye论坛热点月报 总第5期

    报告指出,利用memcached这种分布式缓存系统,可以有效地进行SNA的实现,提升数据处理速度。 8. **memcached的性能优化**:memcached因其高性能而被广泛使用。报告提到其访问速度可达66000TPS(每秒事务数),并有...

    大数据功能模块概要设计.doc

    J2EE服务端开发涉及的库包括apache-commons提供基础类扩展,json-lib处理JSON数据,junit进行单元测试,struts2/spring mvc作为MVC框架,ibatis/mybatis/hibernate作为ORM层选择。 **选型** 3.1 **中间件**:商业...

    Jforum相关文档和PPT

    了解如何配置缓存策略、添加和更新缓存项,以及处理缓存失效,都是优化论坛性能的重要环节。 最后,权限控制是保证论坛安全的关键。Jforum提供了用户角色和权限的管理,包括登录验证、权限分配、访问控制等。理解...

    大型网站数据库优化大型网站数据库优化.docx

    同时,选用高效的编程框架,如Spring+Ibatis,Spring的IOC机制能有效避免频繁创建对象,而Ibatis的直接SQL操作和缓存机制则能提升数据库交互效率。 2. **数据库缓存与优化**:DBA的角色在此过程中不可或缺,他们...

    大数据功能模块概要设计_V1.1.pdf

    在技术选型上,文档推荐了中间件如weblogic、websphere、jbos、jetty和tomcat,数据库包括关系型的Oracle和MySQL,以及NoSQL数据库如mongodb、hadoop、hive、hbase、memcached和redis。底层开发框架方面,struts2、...

    AfinalDemo

    通过在实体类上添加注解,可以指定哪些属性需要被缓存。 事务管理是Afinal的另一大亮点。Afinal支持Spring的声明式事务管理,通过@Transactional注解即可控制事务的边界。同时,Afinal还提供了一种基于AOP的事务...

    JAVA技术架构及开发规范文档.docx

    文档未具体说明采用哪种缓存解决方案,但常见的选择包括Redis或Memcached。 总体而言,这份文档详尽地描述了Java技术架构和开发规范,涵盖了从前端到后端的各个环节,对于理解和实施大型Java项目具有重要的指导意义...

    ssh学习总结知识.pdf

    二级缓存可选,可以使用第三方缓存如Ehcache或分布式缓存如Memcached,以支持多服务器共享。 4. **数据服务层**: - 数据库通常位于三层架构的数据服务层,Oracle是一个常用的关系型数据库管理系统,提供高效稳定...

Global site tag (gtag.js) - Google Analytics