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 ...
随机推荐
- DC游戏《斑鸠》原创赏析[转载]
游戏背景: 凤来之国本来只是边远地区的一个小国.但现在他们却自称为得到“神之力”的“神通者”,在“选民思想”“和平统一”之类的名义下开始了对各地的武力侵略. 事情的起因是因为凤来之 ...
- 定时每天备份mysql
http://blog.csdn.net/panning_hu/article/details/9210001 Spring MVC Spring中MVC框架的底层实现 http://blog.csd ...
- IC卡,ID卡,M1卡,射频卡
一般把可读可写,频率是13.56MHz的射频卡称为IC卡,IC卡可以写入数据, 只能读,频率是125KHz的射频卡称为ID卡, M1卡是NXP公司的S50卡的一种叫法,国内的复旦F08,达华的TKS5 ...
- CodeIgniter结合Bootstrap
CodeIgniter-Bootstrap结合了 cI和bootstrap的长处,一个专注于服务器端,一个专注于ui,这个把2个结合起来了.框架地址: http://www.andyhawthorne ...
- 赵雅智:service_startService生命周期
案例演示 布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...
- 概率图模型(PGM)学习笔记(四)-贝叶斯网络-伯努利贝叶斯-多项式贝叶斯
之前忘记强调了一个重要差别:条件概率链式法则和贝叶斯网络链式法则的差别 条件概率链式法则 贝叶斯网络链式法则,如图1 图1 乍一看非常easy认为贝叶斯网络链式法则不就是大家曾经学的链式法则么,事实上 ...
- UVA 10312 - Expression Bracketing(数论+Catalan数)
题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1253">10312 - Exp ...
- 【转】利用Ajax.BeginForm提交文件
Ajax.BeginForm @using (Ajax.BeginForm("YourAction", "YourController", new AjaxOp ...
- VM VirtualBox安装Centos6.5
· · 参考资料:http://www.jb51.net/os/239738.html 如果安装图形界面,内存分配要大于628M 和下图安装选项无关,1.2都可以 界面说明: Install or u ...
- struts jsp传值到action,乱码的解决方案
使用了Struts框架,前台写好了编码为utf-8 <%@ page language="java" contentType="text/html; charset ...