ibatis基础上添加memcached缓存

来源:互联网 发布:mac进入屏保快捷键 编辑:程序博客网 时间:2024/06/05 19:19
ibatismemcachedexceptionobjectstringnull

 

在ibatis源码基础上修改,增加对memcached支持,通过配置IBatis的xml文件即可实现memcached细粒度话缓存,使用简单,缓存效果好。spring下首先初始化MemcachedManager对象,或者通过程序初始化也一样,不要用ibatis官方的jar包,否则会冲突

init-method="init"destroy-method="closePool">
192.168.0.1:11111, 192.168.0.2:11111

Unknownend tag for

 

然后配置sqlMapConfig.xml文件:

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

 

 

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

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

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

Unknownend tag for

#加入缓存

 

#删除对象,删除缓存

delete from albums where id=1 and accId=1#(加上accId可以删除分组缓存)
packagecom.ibatis.sqlmap.engine.cache.memcached;  importjava.io.Serializable; importjava.util.Collection; importjava.util.Date; importjava.util.Map;  importorg.apache.log4j.Logger;  importcom.danga.MemCached.MemCachedClient; importcom.danga.MemCached.SockIOPool;   publicclassMemcachedManager{         private static Logger logger=Logger.getLogger(MemcachedManager.class);         private static String memcachedDomain="IBATIS_CACHED"; // memcached域名         private Stringserverlist;         private static MemCachedClient mcc=null;         private SockIOPool pool=null;         private int initConn=5;         private int minConn=5;         private int maxConn=50;                 public voidinit() {               if (mcc != null)                     return;               logger.info("Initializing ibatis memcachedstart.");               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(Exceptionex){                            logger.error(ex.getMessage());                     }               }                if (mcc == null) {                      mcc=newMemCachedClient(memcachedDomain);                     mcc.setCompressEnable(false);                     mcc.setCompressThreshold(0);               }              logger.info("Initializing youxigu Memcachedok!");        }                 public voidclosePool() {               pool.shutDown();               mcc = null;               pool=null;              logger.info("Ibatis memcached poolclosed");        }                 public static booleanset(Objectkey,Serializableobj){              logger.debug("setkey:" +getKey(key) + ", value:" + obj);               try {                     returnmcc.set(getKey(key),obj);               } catch (Exceptione){                     logger.error("Poolset error!");                     e.printStackTrace();               }               return false;        }                 public static booleanset(Objectkey,Serializableobj,longcacheTime) {               try {                     returnmcc.set(getKey(key),obj,newDate(cacheTime));               } catch (Exceptione){                     logger.error("Poolset error!");                     e.printStackTrace();               }               return false;        }                 public static voidreplace(intkey,Serializablevalue, longcacheTime) {               try {                     mcc.replace(getKey(key),value, new Date(cacheTime));               } catch (Exceptione){                     logger.error("pool set error!");               }        }                 public static Objectget(Objectkey){               Object result=null;               String realkey=getKey(key);               try {                     result =mcc.get(realkey);               } catch (Exceptione){                     e.printStackTrace();               }              logger.debug("getkey:" +getKey(key) + ", value:" +result);               returnresult;        }                 public static voidsetCounter(Objectkey,longcount) {               try {                     mcc.storeCounter(getCountKey(key),count);               } catch (Exceptione){                     logger.error("PoolsetCounter error!");               }        }                 public static voidaddCounter(Objectkey){               if(mcc.get(getCountKey(key))==null){                     mcc.storeCounter(getCountKey(key),0);               }               try {                     mcc.incr(getCountKey(key));               } catch (Exceptione){                     logger.error("PoolsetCounter error!");               }        }                 public static voiddecreaseCounter(Objectkey){               try {                     mcc.decr(getCountKey(key));               } catch (Exceptione){                     logger.error("PoolsetCounter error!");               }        }                 public static voidaddCounter(Objectkey,longaddValue) {               try {                     mcc.incr(getCountKey(key),addValue);               } catch (Exceptione){                     logger.error("pool setCounter error!");               }        }                 public static longgetCounter(Objectkey){               long result=0;               try {                     result =mcc.getCounter(getCountKey(key));               } catch (Exceptione){                     logger.error(e.getMessage());               }               returnresult;        }                 public static boolean delete(Objectkey){               try {                     returnmcc.delete(getKey(key));               } catch (Exceptione){                     logger.error(e.getMessage());               }               return false;        }                 public static longdeleteCounter(Objectkey){               try {                     returnmcc.decr(getCountKey(key));               } catch (Exceptione){                     logger.error("pool setCounter error!");               }               return 0;        }                 public static voidflushAll() {               mcc.flushAll();        }                @SuppressWarnings("unchecked")        public static longsize(){               longsize=0L;               Map<</SPAN>String,Map<</SPAN>String,String>>status=mcc.statsItems();               Collection<</SPAN>Map<</SPAN>String,String>>values=status.values();               for (Map<</SPAN>String,String>state:values){                     Stringnum=state.get("items:1:number");                     if(num==null)                            continue;                                          size+=Long.parseLong(state.get("items:1:number"));               }               returnsize;        }                 private static StringgetKey(Objectkey){               return memcachedDomain+"@"+key;        }         private static StringgetCountKey(Objectkey){               return memcachedDomain+"@"+ key+"_count";        }                 public voidsetServerlist(Stringserverlist) {               this.serverlist=serverlist;        }                 public voidsetInitConn(intinitConn) {               this.initConn=initConn;        }                 public voidsetMinConn(intminConn) {               this.minConn=minConn;        }                 public voidsetMaxConn(intmaxConn) {               this.maxConn=maxConn;        }                 public voidsetMemcachedDomain(StringmemcachedKey) {               MemcachedManager.memcachedDomain=memcachedKey;        } } 
原创粉丝点击