缓存不管哪个框架都是显得特别的重要,今天自己测试实现了mybatis自定义缓存,从而理解mybatis缓存的工作原理。

首先缓存类要实现Cache接口:具体实现如下package com.ibatis.blog;

package com.ibatis.cache;



import java.util.concurrent.ConcurrentHashMap;

import java.util.concurrent.locks.ReadWriteLock;

import java.util.concurrent.locks.ReentrantReadWriteLock;



import org.apache.ibatis.cache.Cache;



public class MyCache implements Cache

{

    private ReadWriteLock lock = new ReentrantReadWriteLock();

    private ConcurrentHashMap<Object, Object> cache = new ConcurrentHashMap<Object, Object>();

    private String id;



    public MyCache()

    {

    }

  / /这个构造方法必须有

    public MyCache(String id)

    {

        this.id = id;

    }



    public void clear()

    {

        cache.clear();

    }



    public String getId()

    {

        System.out.println("getId-->" + id);

        return id;

    }



    public Object getObject(Object key)

    {

        System.out.println("getObject---key:" + key);

        return cache.get(key);

    }



    public ReadWriteLock getReadWriteLock()

    {

//        System.out.println("getReadWriteLock");

        return lock;

    }



    public synchronized int getSize()

    {

        System.out.println("getsize");

        return cache.size();

    }



    public void putObject(Object key, Object value)

    {

        // System.out.println("putObject--key:" + key);

        // System.out.println("putObject--value:" + value);

        cache.put(key, value);

    }



    public Object removeObject(Object key)

    {

        System.out.println("remove:" + key);

        return cache.remove(key);

    }



}

需要在配置文件中添加:

<cache type="com.ibatis.cache.MyCache"></cache>

进行测试:进行两次相同的查询:

@Test

    public void testSelectAll()

    {

        List<Article> result = service.findAll(null);

        for (Article a : result)

        {

            System.out.println(a);

        }

        System.out.println("-----------");

        List<Article> result1 = service.findAll(null);

        for (Article a : result1)

        {

            System.out.println(a);

        }

    }

产生的结果如下:

getId-->article

getObject---key:-395398842:3059602323:article.article_selectAll:0:2147483647:select * from

        article

getObject---key:-1263983414:-596172894:article.selectUser:0:2147483647:select * from user

        where

        id=?:1

getObject---key:-1263983414:-596172894:article.selectUser:0:2147483647:select * from user

        where

        id=?:1

Article [id=1, name=firstArticle, time=2013-11-3 0:00:00, user=User [article=null, id=1, name=d, sex=1]]

Article [id=2, name=secondArticle, time=2013-11-3 0:00:00, user=User [article=null, id=1, name=d, sex=1]]

-----------

getObject---key:-395398842:3059602323:article.article_selectAll:0:2147483647:select * from

        article

Article [id=1, name=firstArticle, time=2013-11-3 0:00:00, user=User [article=null, id=1, name=d, sex=1]]

Article [id=2, name=secondArticle, time=2013-11-3 0:00:00, user=User [article=null, id=1, name=d, sex=1]]

缓存设置成功,第二次查询的时候直接从缓存中查询了!

mybatis 自定义缓存 cache的更多相关文章

  1. 【MyBatis源码解析】MyBatis一二级缓存

    MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相 ...

  2. mybatis学习--缓存(一级和二级缓存)

    声明:学习摘要! MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级) ...

  3. MyBatis 一、二级缓存和自定义缓存

    1.一级缓存 ​ MyBatis 默认开启了一级缓存,一级缓存是在SqlSession 层面进行缓存的.即,同一个SqlSession ,多次调用同一个Mapper和同一个方法的同一个参数,只会进行一 ...

  4. Mybatis自定义分布式二级缓存实现与遇到的一些问题解决方案!

    先说两句: 我们都知道Mybatis缓存分两类: 一级缓存(同一个Session会话内) & 二级缓存(基于HashMap实现的以 namespace为范围的缓存) 今天呢, 我们不谈一级缓存 ...

  5. redis学习总结-redis作为MyBatis的自定义缓存

    1.RedisCache.java package com.houtai.cache; import java.util.concurrent.locks.ReadWriteLock; import ...

  6. (转)MyBatis 一、二级缓存和自定义缓存

    1.一级缓存 MyBatis 默认开启了一级缓存,一级缓存是在SqlSession 层面进行缓存的.即,同一个SqlSession ,多次调用同一个Mapper和同一个方法的同一个参数, 只会进行一次 ...

  7. MyBatis功能点一:二级缓存cache

    对于Mybatis缓存分作用域等维度区别一.二级缓存特点如下图: 分析缓存源码首先得找到缓存操作的入口:前面已经分析,sqlsesion.close()仅对一级缓存有影响,而update等对一/二级缓 ...

  8. mybatis 3.x 缓存Cache的使用

    mybatis 3.x 已经支持cache功能了,使用很简单,在mappper的xml文件里添加以下节点: <mapper namespace="com.cnblogs.yjmyzz. ...

  9. mybatis 缓存(cache)的使用

    许多应用程序,为了提高性能而增加缓存, 特别是从数据库中获取的数据. 在默认情况下,mybatis 的一级缓存是默认开启的.类似于hibernate, 所谓一级缓存,也就是基于同一个sqlsessio ...

随机推荐

  1. java-锁膨胀的过程

    先来看个奇怪的demo public class A { int i=0; // boolean flag =false; public synchronized void parse(){ i++; ...

  2. 【山外笔记-数据库】Memcached详解教程

    本文打印版文档下载地址 [山外笔记-数据库]Memcached详解教程-打印版.pdf 一.Memcached数据库概述 1.Memcached简介 (1)Memcached是一个自由开源的,高性能, ...

  3. redis: Zset有序集合类型(七)

    存值:zadd myset 1 one 取值:zrange myset 0 -1 127.0.0.1:6379> zadd myset 1 one #存值 分值为1 (integer) 1 12 ...

  4. 【arithmetic】搜索插入位置

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置 可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6], 5 输出: ...

  5. 掌握游戏开发中类Message、Handle

    1.   实验目的 1. 自主地设计图形界面 2. 掌握消息类Message的应用 3. 掌握消息处理类Handle的应用 4. 掌握子线程中中更新UI界面的方法 2.  实验内容 1. 在主界面设置 ...

  6. 基于udp协议的套接字通信

    服务端: import socket server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) server.bind(('127.0.0.1',8 ...

  7. 在项目中部署redis的读写分离架构(包含节点间认证口令)

    #### 在项目中部署redis的读写分离架构(包含节点间认证口令) ##### 1.配置过程 ---  1.此前就是已经将redis在系统中已经安装好了,redis utils目录下,有个redis ...

  8. kubeadm 默认镜像配置问题引申

    背景: 每次使用功能kubeadm的时候都需要提前准备好镜像,为什么自定义使用的镜像源呢? 在没有翻越围墙时 kubeadm init --kubernetes-version=v1.13.0 --p ...

  9. C++-doctest-测试框架

    C++-doctest-测试框架 C++UnitTestDoctest 测试框架 doctest 是用过的最简单好用的的单元测试框架, 只需要引用 一个头文件即可 无main 函数的测试样例 #def ...

  10. 吞吐量(TPS)、QPS、并发数、响应时间(RT)

    1. 响应时间(RT)  响应时间是指系统对请求作出响应的时间.直观上看,这个指标与人对软件性能的主观感受是非常一致的,因为它完整地记录了整个计算机系统处理请求的时间.由于一个系统通常会提供许多功能, ...