mybaits+redis实现二级缓存

          mybaits本身有一级缓存和二级缓存,一级缓存我这里不做赘述,因为作用不是特别明显。这次我们要用的是二级缓存,二级缓存的主要是借助第三方内存/服务。我这边选择的是redis作为第三方缓存。在使用本demo之前,需要童鞋们自己本机下载一个redis服务器,具体安装可以自行百度一下。好了,废话不多说,直接上代码,我会在上代码的过程中一步一步的介绍。

第一步:配置maven包(mybaits和redis的jar包),这个可以在maven中央库里面找到,也可以从我提供的代码中查看pom.xml

第二步:配置application.xml(添加redsi的缓存)

<!-- 配置数据源 -->
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<!-- 		<property name="locations" value="classpath:jdbc.properties"/>
		<property name="locations" value="classpath:redis.properties"/> -->
		<property name="locations">
		<list>
		<value>classpath:jdbc.properties</value>
		<value>classpath:redis.properties</value>
		</list>
		</property>
	</bean>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
		<!-- 数据库基本信息配置 -->  
       <property name = "url" value = "${url}" />    
       <property name = "username" value = "${username}" />    
       <property name = "password" value = "${password}" />    
       <property name = "driverClassName" value = "${driverClassName}" />    
       <property name = "filters" value = "${filters}" />    
        <!-- 最大并发连接数 -->  
       <property name = "maxActive" value = "${maxActive}" />  
       <!-- 初始化连接数量 -->  
       <property name = "initialSize" value = "${initialSize}" />  
       <!-- 配置获取连接等待超时的时间 -->  
       <property name = "maxWait" value = "${maxWait}" />  
       <!-- 最小空闲连接数 -->  
       <property name = "minIdle" value = "${minIdle}" />    
       <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->  
       <property name = "timeBetweenEvictionRunsMillis" value ="${timeBetweenEvictionRunsMillis}" />  
       <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->  
       <property name = "minEvictableIdleTimeMillis" value ="${minEvictableIdleTimeMillis}" />    
       <property name = "validationQuery" value = "${validationQuery}" />    
       <property name = "testWhileIdle" value = "${testWhileIdle}" />    
       <property name = "testOnBorrow" value = "${testOnBorrow}" />    
       <property name = "testOnReturn" value = "${testOnReturn}" />    
       <property name = "maxOpenPreparedStatements" value ="${maxOpenPreparedStatements}" />  
       <!-- 打开 removeAbandoned 功能 -->  
       <property name = "removeAbandoned" value = "${removeAbandoned}" />  
       <!-- 1800 秒,也就是 30 分钟 -->  
       <property name = "removeAbandonedTimeout" value ="${removeAbandonedTimeout}" />  
       <!-- 关闭 abanded 连接时输出错误日志 -->     
       <!-- <property name = "logAbandoned" value = "${logAbandoned}" />  -->
	</bean>
	 <!-- redis连接池 -->
     <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"/>
 
     <!-- redis连接工厂 -->
     <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
         <property name="hostName" value="${redis_hostName}"/>
         <property name="port" value="${redis_port}"/>
         <property name="password" value="${redis_password}"/>
         <property name="timeout" value="${redis_timeout}"/>
         <property name="poolConfig" ref="poolConfig"></property>
     </bean>
     
 	<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="keySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
        </property>
        <property name="valueSerializer">
            <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
        </property>
    </bean> 
    
    <!--redis缓存:使用中间类解决RedisCache.jedisConnectionFactory的静态注入,从而使MyBatis实现第三方缓存-->
    <bean id="redisCacheTransfer" class="com.iuweb.common.util.RedisCacheTransfer">
         <property name="connectionFactory" ref="connectionFactory"/>
    </bean> 

 

第三步:创建RedisCacheTransfer类

/**
 * 
 */
package com.iuweb.common.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;

/**
 * 
  * 
  * @Description:使用第三方内存数据库Redis作为二级缓存
  * @author wangguan
  * @date 2018年5月21日 下午2:45:53
  * @versidescribeon v 1.0
 */
public class RedisCacheTransfer {
	
	 @Autowired
	    public void setconnectionFactory(JedisConnectionFactory jedisConnectionFactory) {
	        RedisCache.setJedisConnectionFactory(jedisConnectionFactory);
	    }


}

 

第四步:RedisCahe类

/**
 * 
 */
package com.iuweb.common.util;


import org.apache.ibatis.cache.Cache;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;

import redis.clients.jedis.exceptions.JedisConnectionException;

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;


/**
 * 
  * 
  * @Description:创建中间类RedisCacheTransfer,完成RedisCache.jedisConnectionFactory的静态注入,静态注入中间类
  * @author wangguan
  * @date 2018年5月21日 下午2:51:17
  * @versidescribeon v 1.0
 */
public class RedisCache implements Cache
{
    //private static final Logger logger = LoggerFactory.getLogger(RedisCache.class);

    private static JedisConnectionFactory jedisConnectionFactory;

    private final String id;

    /**
     * The {@code ReadWriteLock}.
     */
    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

    public RedisCache(final String id) {
        if (id == null) {
            throw new IllegalArgumentException("Cache instances require an ID");
        }
        System.out.println("MybatisRedisCache:id=" + id);
        //logger.debug("MybatisRedisCache:id=" + id);
        this.id = id;
    }

    @Override
    public void clear()
    {
        RedisConnection connection = null;
        try
        {
            connection = jedisConnectionFactory.getConnection();
            connection.flushDb();
            connection.flushAll();
        }
        catch (JedisConnectionException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (connection != null) {
                connection.close();
            }
        }
    }

    @Override
    public String getId()
    {
        return this.id;
    }

    @Override
    public Object getObject(Object key)
    {
        Object result = null;
        RedisConnection connection = null;
        try
        {
            connection = jedisConnectionFactory.getConnection();
            RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer();
            result = serializer.deserialize(connection.get(serializer.serialize(key)));
        }
        catch (JedisConnectionException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (connection != null) {
                connection.close();
            }
        }
        return result;
    }

    @Override
    public ReadWriteLock getReadWriteLock()
    {
        return this.readWriteLock;
    }

    @Override
    public int getSize()
    {
        int result = 0;
        RedisConnection connection = null;
        try
        {
            connection = jedisConnectionFactory.getConnection();
            result = Integer.valueOf(connection.dbSize().toString());
        }
        catch (JedisConnectionException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (connection != null) {
                connection.close();
            }
        }
        return result;
    }

    @Override
    public void putObject(Object key, Object value)
    {
        RedisConnection connection = null;
        try
        {
            connection = jedisConnectionFactory.getConnection();
            RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer();
            connection.set(serializer.serialize(key), serializer.serialize(value));
        }
        catch (JedisConnectionException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (connection != null) {
                connection.close();
            }
        }
    }

    @Override
    public Object removeObject(Object key)
    {
        RedisConnection connection = null;
        Object result = null;
        try
        {
            connection = jedisConnectionFactory.getConnection();
            RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer();
            result =connection.expire(serializer.serialize(key), 0);
        }
        catch (JedisConnectionException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (connection != null) {
                connection.close();
            }
        }
        return result;
    }

    public static void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory) {
        RedisCache.jedisConnectionFactory = jedisConnectionFactory;
    }

}

 

以上对应redis基本配置完毕,后面是配置mybaits

第五步:依然在applicationContext.xml中配置mybaits

 

<!-- 配置mybatis的sqlSessionFactory -->
	<bean id="sqlSessionFactory" class="com.iuweb.common.util.PackagesSqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation" value="classpath:mybatis-config.xml"></property>  
		<!-- 自动扫描mappers.xml文件 -->
		<property name="mapperLocations" value="classpath:com/iuweb/*/*.xml"></property>
		<!--自动扫描实体类 -->
		<property name="typeAliasesPackage" value="com.iuweb.*.model" />
		<property name="plugins">
			<list>    
				<bean class="com.iuweb.common.pagePlug.PagePlugin">
				    <!-- assue dialect: oracle/mysql -->
					<property name="dataDialect" value="mysql" />
					<property name="pageSqlId" value=".*ByPage.*" />
				</bean>
			</list>
		</property>
	</bean>

 

第五步:在mybatis-config.xml中配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
	PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<settings>
	
		<setting name="cacheEnabled" value="true"/><!-- 开启二级缓存 -->  
		<setting name="lazyLoadingEnabled" value="true"/>  
		<setting name="multipleResultSetsEnabled" value="true"/>  
		<setting name="useColumnLabel" value="true"/>  
		<setting name="useGeneratedKeys" value="true"/>  
		<setting name="defaultExecutorType" value="SIMPLE"/>  
		<setting name="defaultStatementTimeout" value="25000"/>
		<!-- 打印查询语句 -->  
		<setting name="logImpl" value="STDOUT_LOGGING" /> 
	</settings>
</configuration>

 

基本配置项已经做好了。下面就开始进行具体的demo实验了。controller和service层我就不写了,没有什么变化。这里我贴出mapper.xml

 

 

运行一下,在后台的控制台就能看出效果了。

PS:提供运行的demo,是从自己的eclipse中copy出来的,另外项目中用到了redis,mysql。需要提前准备好。jdk环境是1.7的

https://download.csdn.net/download/qq_35515521/10435226

 

如果觉得有用得话,可以关注我得公众号。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值