redisはmybatisの2次キャッシュをします

7438 ワード

1,mybatisのキャッシュ
まずmybatisには1次キャッシュと2次キャッシュの概念1)があり,1次キャッシュはSqlSessionレベルのキャッシュであることを知る.データベースの操作時にsqlSessionオブジェクトを構築する必要があります.オブジェクトにはキャッシュデータを格納するための(メモリ領域)データ構造(HashMap)があります.異なるsqlSession間のキャッシュデータ領域(HashMap)は互いに影響しない.2)レベルキャッシュは複数のSqlSessionで共有され、sqlSessionFactoryレベルであり、その役割ドメインはmapperの同じnamespaceであり、異なるsqlSessionは同じnamespaceの下のsql文を2回実行し、sqlにパラメータを渡すのも同じである最終的に同じsql文を実行し、1回目の実行が終わるとデータベースでクエリーしたデータをキャッシュ(メモリ)に書き込む.2回目にキャッシュからデータを取得すると、データベースからクエリーがなくなり、クエリーの効率が向上します.Mybatisのデフォルトでは、2次キャッシュが開かれていません.settingグローバルパラメータで2次キャッシュを開くように構成する必要があります.2,redisがmybatisの2次キャッシュを行うメリットRedisはデータの永続化をサポートし、メモリのデータをディスクに保持し、再起動時に再ロードして使用することができます.Redisは、単純なkey-valueタイプのデータだけでなく、list、set、zset、hashなどのデータ構造の格納もサポートします.Redisは、データのバックアップ、すなわちmaster-slaveモードのデータバックアップをサポートします.Redisの優位性は極めて高く、Redisが読める速度は110000回/s、書く速度は81000回/sです.豊富なデータ型–Redisは、バイナリ・ケースのStrings、Lists、Hashes、Sets、Ordered Setsのデータ型操作をサポートします.原子‐Redisのすべての操作は原子的であり,同時にRedisはいくつかの操作の完全な並列化後の原子的実行をサポートする.
3 mybatisの2次キャッシュの実装プロファイルによってmybatisの2次キャッシュを開く
<configuration>
    
    <settings>
        <setting name="cacheEnabled" value="true"/>
    settings>
configuration>

jedisツールクラスを書いてredisを操作する
public class JedisUtil {
    private static JedisPool jedisPool=null;
    //          
    static{
        //       
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        //          
        //     
        poolConfig.setMaxTotal(100);
        //      
        poolConfig.setMaxIdle(10);
        //        
        jedisPool=new JedisPool(poolConfig, "192.168.12.135");


    }
    //  jedis  
    public static Jedis getJedis(){
        Jedis jedis = jedisPool.getResource();

        return jedis;

    }
    //  jedis  
    public static void closeJedis(Jedis jedis){
        if (jedis!=null) {
            jedis.close();
        }
    }

Cacheインタフェースライトツールクラスを実現mybatisのcacheインタフェースを実現
public  class RedisCache implements Cache {
    private String id;
    public void setId(String id){
        this.id=id;
    }
    @Override
    public void clear() {
        // TODO Auto-generated method stub

    }
    public RedisCache(String id){
        this.id=id;
    }

    @Override
    public String getId() {
        // TODO Auto-generated method stub
        return id;
    }

    @Override
    public Object getObject(Object key) {
        Jedis jedis = JedisUtil.getJedis();
        Object obj=null;
        if (jedis.exists(SerializationUtils.serialize((Serializable)key))){
            byte[] bs = jedis.get(SerializationUtils.serialize((Serializable)key));
            //    
            obj = SerializationUtils.deserialize(bs);
        }
        JedisUtil.closeJedis(jedis);
        return obj;
    }

    @Override
    public ReadWriteLock getReadWriteLock() {
        // TODO Auto-generated method stub
        System.out.println("111");
        return null;
    }

    @Override
    public int getSize() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void putObject(Object key, Object value) {
        Jedis jedis = JedisUtil.getJedis();
        // jedis    
        jedis.set(SerializationUtils.serialize((Serializable)key),SerializationUtils.serialize((Serializable)value));
        //    
        JedisUtil.closeJedis(jedis);
    }

    @Override
    public Object removeObject(Object key) {
        Jedis jedis = JedisUtil.getJedis();
        Object obj=null;
        if (jedis.exists(SerializationUtils.serialize((Serializable)key))) {
            obj=jedis.del(SerializationUtils.serialize((Serializable)key));
        }
        return obj;
    }

キャッシュが必要なmapperファイルにcacheラベルtypeを追加してcacheインタフェースを実現するクラスのフルリミット名を付けます.
    type="com.eric.ddbg.utils.RedisCache" />

これによりredisがmybatisの2次キャッシュを簡単に実現