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 ...
随机推荐
- Oracle中sign函数和decode函数的使用
Oracle中sign函数和decode函数的使用 1.比较大小函数SIGN sign(x)或者Sign(x)叫做 符号函数,其功能是取某个数的符号(正或负): 当x>0,sign(x)=1; ...
- <Win32_16>来看看标准菜单和右键菜单的玩法
日常应用中,菜单主要分为两种:(1) 标准菜单(处于应用程序菜单栏处的菜单) (2)右键快捷菜单 几乎你所见过或使用过的软件中,都有它俩儿 为应用程序添加它们的基本步骤: (1)用代码或者IDE ...
- vs c++配置opencv(1)
环境: vs2013 opencv2.4.13 准备工作: 1.安装opencv. opencv各版本间存在API差异,opencv提供相应版本的vc文件,在其安装目录 ..opencv\build\ ...
- mahout贝叶斯算法开发思路(拓展篇)2
如果想直接下面算法调用包,可以直接在mahout贝叶斯算法拓展下载,该算法调用的方式如下: $HADOOP_HOME/bin hadoop jar mahout.jar mahout.fansy.ba ...
- 与一线Linux嵌入式开发project师的对话
转:与一线Linux嵌入式开发project师的对话 陈project师一直做Linux的嵌入式开发.作为在开发一线的project师.他对非常多问题的看法可能更切合实际需求,于是,通过邮件.就嵌入式 ...
- 网络收发之cycleBuf
#pragma once #include <iostream> #include <string> class cyclebuffer { protected: volati ...
- js正则表达式验证字符长度
原理,就是把一个汉字替换为两个字母,来实现长度验证. //js正则验证字符长度 第一种:直接输出长度 alert('1sS#符'.replace(/[^\x00-\xff]/g, 'AA').leng ...
- [转]SAP中找表的方法
http://blog.chinaunix.net/uid-24063584-id-2642334.html 分类: 18种根据屏幕字段查找数据库表数据的技巧 帮助 18种根据屏幕字段查找潜在数据 ...
- 用pc浏览器打开手机页面
原理是仿造http包头,下面已chrome为例. 方法:运行->输入如下手机操作系统对应的代码即可. 安卓: chrome.exe --user-agent="Mozilla/5.0 ...
- JDBC_获取数据库连接
<span style="font-size:24px;">package src.com.jdbc.java; import java.io.IOException; ...