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; } }