redis(五)redis与Mybatis的无缝整合让MyBatis透明的管理缓存二
在上一篇文中的Cahe类存在各种问题如:一直使用同一个连接,每次都创建新的Cache,项目中老是爆出connection timeout 的异常,存储的key过长等等一系列的问题,解决问题最好的办法就是看源码和看官方的文档说明,jedis的文档还是够用的,接下来把cache也改造以下附上代码。
- package cn.seafood.cache;
- import java.io.ByteArrayInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.util.concurrent.locks.ReadWriteLock;
- import java.util.concurrent.locks.ReentrantReadWriteLock;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.apache.ibatis.cache.Cache;
- import redis.clients.jedis.Jedis;
- import redis.clients.jedis.JedisPool;
- import redis.clients.jedis.JedisPoolConfig;
- import redis.clients.jedis.exceptions.JedisConnectionException;
- import cn.seafood.util.PropertiesLoader;
- /**
- *
- * @ClassName: RedisCache
- * @Description: TODO(使用第三方缓存服务器redis,处理二级缓存)
- * @author LiuYi
- * @date 2014年6月9日 下午1:37:46
- *
- */
- public class RedisCache implements Cache {
- private static Log log = LogFactory.getLog(RedisCache.class);
- /** The ReadWriteLock. */
- private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
- private String id;
- public RedisCache(final String id) {
- if (id == null) {
- throw new IllegalArgumentException("必须传入ID");
- }
- log.debug("MybatisRedisCache:id=" + id);
- this.id=id;
- }
- @Override
- public String getId() {
- return this.id;
- }
- @Override
- public int getSize() {
- Jedis jedis = null;
- JedisPool jedisPool = null;
- ;
- boolean borrowOrOprSuccess = true;
- try {
- jedis = CachePool.getInstance().getJedis();
- jedisPool = CachePool.getInstance().getJedisPool();
- result = Integer.valueOf(jedis.dbSize().toString());
- } catch (JedisConnectionException e) {
- borrowOrOprSuccess = false;
- if (jedis != null)
- jedisPool.returnBrokenResource(jedis);
- } finally {
- if (borrowOrOprSuccess)
- jedisPool.returnResource(jedis);
- }
- return result;
- }
- @Override
- public void putObject(Object key, Object value) {
- if(log.isDebugEnabled())
- log.debug("putObject:" + key.hashCode() + "=" + value);
- if(log.isInfoEnabled())
- log.info("put to redis sql :" +key.toString());
- Jedis jedis = null;
- JedisPool jedisPool = null;
- boolean borrowOrOprSuccess = true;
- try {
- jedis = CachePool.getInstance().getJedis();
- jedisPool = CachePool.getInstance().getJedisPool();
- jedis.set(SerializeUtil.serialize(key.hashCode()), SerializeUtil.serialize(value));
- } catch (JedisConnectionException e) {
- borrowOrOprSuccess = false;
- if (jedis != null)
- jedisPool.returnBrokenResource(jedis);
- } finally {
- if (borrowOrOprSuccess)
- jedisPool.returnResource(jedis);
- }
- }
- @Override
- public Object getObject(Object key) {
- Jedis jedis = null;
- JedisPool jedisPool = null;
- Object value = null;
- boolean borrowOrOprSuccess = true;
- try {
- jedis = CachePool.getInstance().getJedis();
- jedisPool = CachePool.getInstance().getJedisPool();
- value = SerializeUtil.unserialize(jedis.get(SerializeUtil.serialize(key.hashCode())));
- } catch (JedisConnectionException e) {
- borrowOrOprSuccess = false;
- if (jedis != null)
- jedisPool.returnBrokenResource(jedis);
- } finally {
- if (borrowOrOprSuccess)
- jedisPool.returnResource(jedis);
- }
- if(log.isDebugEnabled())
- log.debug("getObject:" + key.hashCode() + "=" + value);
- return value;
- }
- @Override
- public Object removeObject(Object key) {
- Jedis jedis = null;
- JedisPool jedisPool = null;
- Object value = null;
- boolean borrowOrOprSuccess = true;
- try {
- jedis = CachePool.getInstance().getJedis();
- jedisPool = CachePool.getInstance().getJedisPool();
- );
- } catch (JedisConnectionException e) {
- borrowOrOprSuccess = false;
- if (jedis != null)
- jedisPool.returnBrokenResource(jedis);
- } finally {
- if (borrowOrOprSuccess)
- jedisPool.returnResource(jedis);
- }
- if(log.isDebugEnabled())
- log.debug("getObject:" + key.hashCode() + "=" + value);
- return value;
- }
- @Override
- public void clear() {
- Jedis jedis = null;
- JedisPool jedisPool = null;
- boolean borrowOrOprSuccess = true;
- try {
- jedis = CachePool.getInstance().getJedis();
- jedisPool = CachePool.getInstance().getJedisPool();
- jedis.flushDB();
- jedis.flushAll();
- } catch (JedisConnectionException e) {
- borrowOrOprSuccess = false;
- if (jedis != null)
- jedisPool.returnBrokenResource(jedis);
- } finally {
- if (borrowOrOprSuccess)
- jedisPool.returnResource(jedis);
- }
- }
- @Override
- public ReadWriteLock getReadWriteLock() {
- return readWriteLock;
- }
- /**
- *
- * @ClassName: CachePool
- * @Description: TODO(单例Cache池)
- * @author LiuYi
- * @date 2014年6月17日 上午10:50:52
- *
- */
- public static class CachePool {
- JedisPool pool;
- private static final CachePool cachePool = new CachePool();
- public static CachePool getInstance(){
- return cachePool;
- }
- private CachePool() {
- JedisPoolConfig config = new JedisPoolConfig();
- );
- config.setMaxWaitMillis(1000l);
- PropertiesLoader pl = new PropertiesLoader("classpath:config/redis.properties");
- pool = new JedisPool(config,pl.getProperty("redisvip"));
- }
- public Jedis getJedis(){
- Jedis jedis = null;
- boolean borrowOrOprSuccess = true;
- try {
- jedis = pool.getResource();
- } catch (JedisConnectionException e) {
- borrowOrOprSuccess = false;
- if (jedis != null)
- pool.returnBrokenResource(jedis);
- } finally {
- if (borrowOrOprSuccess)
- pool.returnResource(jedis);
- }
- jedis = pool.getResource();
- return jedis;
- }
- public JedisPool getJedisPool(){
- return this.pool;
- }
- }
- public static class SerializeUtil {
- public static byte[] serialize(Object object) {
- ObjectOutputStream oos = null;
- ByteArrayOutputStream baos = null;
- try {
- // 序列化
- baos = new ByteArrayOutputStream();
- oos = new ObjectOutputStream(baos);
- oos.writeObject(object);
- byte[] bytes = baos.toByteArray();
- return bytes;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- public static Object unserialize(byte[] bytes) {
- if(bytes == null)return null;
- ByteArrayInputStream bais = null;
- try {
- // 反序列化
- bais = new ByteArrayInputStream(bytes);
- ObjectInputStream ois = new ObjectInputStream(bais);
- return ois.readObject();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- }
- }
redis(五)redis与Mybatis的无缝整合让MyBatis透明的管理缓存二的更多相关文章
- redis(四)redis与Mybatis的无缝整合让MyBatis透明的管理缓存
redis的安装 http://liuyieyer.iteye.com/blog/2078093 redis的主从高可用 http://liuyieyer.iteye.com/blog/207809 ...
- Mybatis与Spring整合,使用了maven管理项目,作为初学者觉得不错,转载下来
转载自:http://www.cnblogs.com/xdp-gacl/p/4271627.html 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype ...
- ssm框架(Spring Springmvc Mybatis框架)整合及案例增删改查
三大框架介绍 ssm框架是由Spring springmvc和Mybatis共同组成的框架.Spring和Springmvc都是spring公司开发的,因此他们之间不需要整合.也可以说是无缝整合.my ...
- Spring+SpringMVC+MyBatis深入学习及搭建(九)——MyBatis和Spring整合
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6964162.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(八)--My ...
- spring + Mybatis + pageHelper + druid 整合源码分享
springMvc + spring + Mybatis + pageHelper + druid 整合 spring 和druid整合,spring 整合druid spring 和Mybatis ...
- Mybatis和Spring整合&逆向工程
Mybatis和Spring整合&逆向工程Mybatis和Spring整合mybatis整合Spring的思路目的就是将在SqlMapConfig.xml中的配置移植到Spring的appli ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(九)Linux下安装redis及redis的常用命令和操作
redis简介 Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis与其他key-value缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存 ...
- 03.redis与ssm整合(mybatis二级缓存)
SSM+redis整合 ssm框架之前已经搭建过了,这里不再做代码复制工作. 这里主要是利用redis去做mybatis的二级缓存,mybaits映射文件中所有的select都会刷新已有缓存,如果不存 ...
- springboot与redis的无缝整合(分布式)
参考博客 : https://blog.csdn.net/csao204282/article/details/54092997 1 首先得引入依赖 <dependency> <gr ...
随机推荐
- QTP 9.2 下载&破解
版本不同 但是破解总是这个 crack文件下载 http://ishare.iask.sina.com.cn/f/13802744.html QTP9.2 下载地址 http://www.duot ...
- 帝国cms让当前栏目显示不同样式(图文)
在使用帝国cms制作栏目导航条时,我们可能会需要根据当前栏目,使当前栏目样式不同. 如图: 此类导航,源代码一般为 <li>全站首页</li> <li class=&qu ...
- CI 模板解析器类
模板解析器类可以解析你的视图文件中的伪变量.它可以解析简单的变量或者以变量作为标签的结构.如果你以前没有用过模板引擎,那么伪变量如下所示: <html><head><ti ...
- C++模板:文件操作
freopen("demo.in","r",stdin); freopen("demo.out","w",stdout) ...
- Android手机设置隐藏命令大全
注意:因Android版本较多,固有部分隐藏命令或不能使用 *#*#4636#*#* 显示手机信息.电池信息.电池记录.使用统计数据.WiFi 信息 *#*#7780#*#* 重设为原厂设定,不会删除 ...
- 微软正式公布Visual Studio 2013 Update 3 (2013.3) RTM
昨天微软的Visual Studio 2013 Update 3(Visual Studio 2013.3)正式公布(RTM)了,做为微软认证金牌合作的葡萄城控件,我们组织力量第一时间进行翻译. ...
- Android多线程及异步处理问题
1.问题提出 1)为何需要多线程? 2)多线程如何实现? 3)多线程机制的核心是啥? 4)到底有多少种实现方式? 2.问题分析 1)究其为啥需要多线程的本质就是异步处理,直观一点说就是不要让用户感觉到 ...
- tomcat配置没啥难的啊
总体上就是: 1.下载jdk并安装. 2.下载tomcat 3.分别设置好环境变量. 4.cmd java -version 如果成功,证明java jdk配置OK startup.bat 如果成功 ...
- JQuery的stop()属性
$(function(){ $('#input1').hover( function(){ $('.div1').stop() .animate({left:) .animate({top:); } ...
- 【转】 利用spring的profile切换不同的环境
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...