dao 接口使用 mybatis @CacheNamespace 缓存注解失效

  1. 使用 mybatis 配置自定义二级缓存,使用 xml 注解可用 <cache type="com.test.dao.MybatisRedisCache" />可成功使用自定义缓存,而使用在 dao 接口上注解 @CacheNamespace(implementation = MybatisRedisCache.class)则不行,(会进自定义缓存类的构造方法,但不能存值,取值);

  2. 自定义缓存类

public class MybatisRedisCache implements Cache {
private static Logger logger = LoggerFactory.getLogger(MybatisRedisCache.class);

    private Jedis redisClient = createReids();

    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

    private String id;

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

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

    @Override
    public int getSize() {

        return Integer.valueOf(redisClient.dbSize().toString());
    }

    @Override
    public void putObject(Object key, Object value) {
        logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>putObject:" + key + "=" + value);
        redisClient.set(SerializeUtil.serialize(key.toString()), SerializeUtil.serialize(value));
    }

    @Override
    public Object getObject(Object key) {
        Object value = SerializeUtil.unserialize(redisClient.get(SerializeUtil.serialize(key.toString())));
        logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>getObject:" + key + "=" + value);
        return value;
    }

    @Override
    public Object removeObject(Object key) {
        return redisClient.expire(SerializeUtil.serialize(key.toString()), 0);
    }

    @Override
    public void clear() {
        redisClient.flushDB();
    }

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

    protected static Jedis createReids() {
        JedisPool pool = new JedisPool("127.0.0.1", 6379);
        return pool.getResource();
    }
}
  1. dao 接口

@CacheNamespace(implementation = (MybatisRedisCache.class))
public interface DaoTest {
    @Options(useCache = true)
    public List<PeoplePo> getUser(PeopleVo p);
}
  1. xml 映射

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.dao.DaoTest">
    <select id="getUser" resultType="com.test.bean.PeoplePo" parameterType="com.test.bean.PeopleVo">
        select t_user.* from t_user where t_user.t_user_id = #{tUserId}
    </select>
</mapper>
阅读 11.3k
2 个回答
新手上路,请多包涵

楼主解决了吗 , 我也是不行,加了一个中转调用的才行

新手上路,请多包涵

缓存方面,配置文件和接口注释不能配合使用,可以改为全注解方式(删除xml中的配置):
@CacheNamespace(implementation = (MybatisRedisCache.class))
public interface DaoTest {

@Select("select t_user.* from t_user where t_user.t_user_id = #{tUserId}")
@Options(useCache = true)
public List<PeoplePo> getUser(PeopleVo p);

}

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题