Annotation invalidation of dao interface using mybatis @ CacheNamespace cache

  1. use mybatis to configure custom secondary cache. Using xml annotation can use < cache type= "com.test.dao.MybatisRedisCache" / > to successfully use custom cache, but using @ CacheNamespace (implementation = MybatisRedisCache.class) on the dao interface is not possible. (it will enter the construction method of custom cache class, but cannot save value, take value);

  2. Custom cache class

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 interface

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

<?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 = -sharp{tUserId}
    </select>
</mapper>
Feb.27,2021

has the landlord solved it? I can't either. I have to add a transfer call


in terms of caching, configuration files and interface comments cannot be used together. You can change to full annotation mode (delete the configuration in xml):
@ CacheNamespace (implementation = (MybatisRedisCache.class)
public interface DaoTest {

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

}

Menu