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 ...
随机推荐
- poj 3335 Rotating Scoreboard - 半平面交
/* poj 3335 Rotating Scoreboard - 半平面交 点是顺时针给出的 */ #include <stdio.h> #include<math.h> c ...
- Linux相关问题-CentOS6.5 x64版本号下Tomcat无法自启动的解决的方法
前段时间使用阿里云server.使用的是Linux CentOS6.5系统,在搭建完Tomcat后发现,Tomcat无法自启动. 将启动tomcat的命令为tomcat_home/bin/startu ...
- ofbiz学习笔记
最新稳定版apache-ofbiz-13.07.02 最新源码ofbiz-release14.12 ant load-demo 载入演示样例数据 ant load-seed 仅仅载入种子数据 ant ...
- .c和.h文件的区别(头文件与之实现文件的的关系~ )
.c和.h文件的区别 一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢 ...
- (转)内核线程对象--Event事件对象
在所有的内核对象中,事件内核对象是个最基本的对象.事件能够通知一个操作已经完成. 客户机和一个服务器,它们之间需要互相进行通信例子(vs2008 ) 事件内核对象的组成 一个使用计数(与所有内核对象一 ...
- BZOJ 3675: [Apio2014]序列分割( dp + 斜率优化 )
WA了一版... 切点确定的话, 顺序是不会影响结果的..所以可以dp dp(i, k) = max(dp(j, k-1) + (sumn - sumi) * (sumi - sumj)) 然后斜率优 ...
- 解决虚拟内存不够导致Eclipse is not responding
安装目录下eclipse.ini中: 修改参数至必要大小. e.g. -vmargs-Djava.net.preferIPv4Stack=true-Dosgi.requiredJavaVersion= ...
- HTML5 总结-表单-输入类型
HTML5 Input 类型 HTML5 新的 Input 类型 HTML5 拥有多个新的表单输入类型.这些新特性提供了更好的输入控制和验证. 本章全面介绍这些新的输入类型: email url nu ...
- win7和ubuntu双系统,win7时间晚8小时解决办法。
装了Win7和Ubuntu双系统后发现,使用Ubuntu后再登陆win7时系统显示时间不准确,比实际时间晚了8小时. 搜索后发现原来Linux和Windows的系统时间管理是不同的.Linux是以主板 ...
- java读写
IO流下分为字节流与字符流,每个流又分为输入输出以及读写. 字节流的两个基类为InputStream与OutputStream. 字符流为Reader和Writer