在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与Memcached集成,实现高效的数据库缓存策略的实例。 Ibatis是一个基于Java的SQL映射框架,它允许开发者编写SQL语句并与Java对象进行绑定,从而避免了传统的JDBC...
1. 添加依赖:在项目中引入Memcached的Java客户端库,如spymemcached,同时确保iBatis的相关库也已添加。 2. 配置iBatis:在iBatis的配置文件中,定义一个Cache配置,指定使用Memcached作为缓存机制。例如: ```xml...
标题中的“ibatis memcached”指的是将MyBatis(原名iBATIS)这个流行的Java持久层框架与Memcached这个分布式内存对象缓存系统相结合,实现数据的高效缓存管理。这种集成允许开发者将MyBatis的二级缓存功能扩展到...
高性能是J2EE应用程序追求的目标,在特定硬件基础上,数据...在对 iBATIS的缓存支持情况进行了介绍和研究的基础上,并结合Spring框架和iBATIS,使用Memcached对iBATIS二级缓存进行了新的实现,使应用的性能得到了很大的提升.
为了更好地利用memcached作为ibatis的二级缓存,我们需要进行相应的配置。以下是具体的配置步骤: ##### 所需jar包: - `java_memcached-release_2.0.1.jar`: 提供了memcached客户端支持。 - `apache-commo-lang....
【标题】"Maven+Spring+Ibatis+Struts2.0+MQ+Memcached 项目构建"涉及了多个核心的Java开发技术和框架,这些技术的集成应用在现代企业级应用开发中非常常见。让我们逐一深入理解这些技术及其在项目中的作用。 1. ...
同时,考虑缓存策略,比如使用Redis或Memcached等缓存系统,减少对数据库的访问次数。 此外,还要注意防止SQL注入,尤其是在动态SQL中,应使用参数化查询或预编译语句,避免直接拼接用户输入的字段。 总结起来,...
4. **配置MyBatis缓存**:MyBatis支持自定义缓存实现,我们需要创建一个实现了`org.apache.ibatis.cache.Cache`接口的类,这个类将负责与Redis交互,进行数据的存取。在MyBatis的配置文件中,将这个自定义缓存类注册...
- **基础类库**:如Apache Commons扩展基础类,JSON库如json-lib,单元测试工具JUnit,MVC框架如Struts2或Spring MVC,ORM框架如iBatis或Hibernate。 3. **选型**: - **中间件**:商业产品如WebLogic、WebSphere...
报告指出,利用memcached这种分布式缓存系统,可以有效地进行SNA的实现,提升数据处理速度。 8. **memcached的性能优化**:memcached因其高性能而被广泛使用。报告提到其访问速度可达66000TPS(每秒事务数),并有...
J2EE服务端开发涉及的库包括apache-commons提供基础类扩展,json-lib处理JSON数据,junit进行单元测试,struts2/spring mvc作为MVC框架,ibatis/mybatis/hibernate作为ORM层选择。 **选型** 3.1 **中间件**:商业...
了解如何配置缓存策略、添加和更新缓存项,以及处理缓存失效,都是优化论坛性能的重要环节。 最后,权限控制是保证论坛安全的关键。Jforum提供了用户角色和权限的管理,包括登录验证、权限分配、访问控制等。理解...
同时,选用高效的编程框架,如Spring+Ibatis,Spring的IOC机制能有效避免频繁创建对象,而Ibatis的直接SQL操作和缓存机制则能提升数据库交互效率。 2. **数据库缓存与优化**:DBA的角色在此过程中不可或缺,他们...
在技术选型上,文档推荐了中间件如weblogic、websphere、jbos、jetty和tomcat,数据库包括关系型的Oracle和MySQL,以及NoSQL数据库如mongodb、hadoop、hive、hbase、memcached和redis。底层开发框架方面,struts2、...
通过在实体类上添加注解,可以指定哪些属性需要被缓存。 事务管理是Afinal的另一大亮点。Afinal支持Spring的声明式事务管理,通过@Transactional注解即可控制事务的边界。同时,Afinal还提供了一种基于AOP的事务...
文档未具体说明采用哪种缓存解决方案,但常见的选择包括Redis或Memcached。 总体而言,这份文档详尽地描述了Java技术架构和开发规范,涵盖了从前端到后端的各个环节,对于理解和实施大型Java项目具有重要的指导意义...
二级缓存可选,可以使用第三方缓存如Ehcache或分布式缓存如Memcached,以支持多服务器共享。 4. **数据服务层**: - 数据库通常位于三层架构的数据服务层,Oracle是一个常用的关系型数据库管理系统,提供高效稳定...