mybatis13--2级缓存

验证内置的2级缓存

创建对应的dao

public interface StudentDao {
    /**
     *  验证mybatis2级缓存!
     */
    Student selectStudentById(Integer sId);

}

创建对应的mapper文件

<?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="cn.bdqn.dao.StudentDao">
  <cache/> <!-- 配置2级缓存 -->
     <select id="selectStudentById" resultType="Student">
      select  sid,sname from  student where sid=#{xxx}
    </select>

</mapper>

实体类实现Serializable序列化接口

/**
 *学生对应的实体类
 */
public class Student  implements Serializable {

    private  Integer sId;
    private  String sName;

    public Integer getsId() {
        return sId;
    }
    public void setsId(Integer sId) {
        this.sId = sId;
    }
    public String getsName() {
        return sName;
    }
    public void setsName(String sName) {
        this.sName = sName;
    }
    public Student(Integer sId, String sName) {
        super();
        this.sId = sId;
        this.sName = sName;
    }
    public Student() {
        super();
    }
    @Override
    public String toString() {
        return "Student [sId=" + sId + ", sName=" + sName +"]";
    }

}

把log4j的配置文件中的显示改成

增加测试类代码

package cn.bdqn.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import cn.bdqn.bean.Student;
import cn.bdqn.dao.StudentDao;
import cn.bdqn.util.SessionUtil;

public class TeacherTest {
    StudentDao dao;
    SqlSession session;

    @Before
    public void before() {
        // 因为需要关闭session 需要把session提取出去
        session = SessionUtil.getSession();
        dao = session.getMapper(StudentDao.class);
    }

    @After
    public void after() {
        if (session != null) {
            session.close();
        }
    }

/**
 * 验证2级缓存
 *
 * 开启内置2级缓存的步骤
 * 01.实体类对象 要实现serializable 序列化接口
 * 02.在mapper文件中 增加  <cache/>节点
 */
    @Test
    public void test1() {
        Student student = dao.selectStudentById(1);
        System.out.println(student);

        session.close(); //关闭了session   一级缓存中的数据肯定清空了

        session = SessionUtil.getSession();  //再次获取session 查询数据
        dao = session.getMapper(StudentDao.class);
        //这时候不会再有sql语句了  因为2级缓存中存在相同的查询(mapper文件中sql的id)和相同的sql语句
        Student student2 = dao.selectStudentById(1);
        System.out.println(student2);
    }

}

查看运行的结果

验证增删改对2级缓存的影响

在dao中新增方法

public interface StudentDao {
    /**
     *  验证mybatis2级缓存!
     */
    Student selectStudentById(Integer sId);

    /**
     * 验证增删改查对2级缓存的影响!
     */
    void addStudent(Student student);
}

在mapper文件中新增

<?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="cn.bdqn.dao.StudentDao">
  <cache/> <!-- 配置2级缓存 -->
     <select id="selectStudentById" resultType="Student">
      select  sid,sname from  student where sid=#{xxx}
    </select>

    <!-- 新增一个学生   验证对2级缓存的影响 -->
    <insert id="addStudent">
      insert into student values(#{sId},#{sName})
      <!--#{sId},#{sName} 对应的是实体类中的属性  -->
    </insert>

</mapper>

在测试类中新增

    /**
     * 验证增删改对2级缓存的影响
     */
    @Test
    public void test2() {
        Student student = dao.selectStudentById(1);
        System.out.println(student);

        session.close(); //关闭了session   一级缓存中的数据肯定清空了

        session = SessionUtil.getSession();  //再次获取session 查询数据
        dao = session.getMapper(StudentDao.class);
        //新增学生信息  看看对2级缓存的影响
        dao.addStudent(new Student(66,"测试"));

        Student student2 = dao.selectStudentById(1);
        System.out.println(student2);
    }
    

得到的结果:

时间: 2024-10-29 19:11:23

mybatis13--2级缓存的相关文章

Hibernate-二级缓存

与Session相对的是,SessionFactory也提供了相应的缓存机制.SessionFactory缓存可以依据功能和目的的不同而划分为内置缓存和外置缓存. SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的副本,而预定义SQL语句是在 Hibernate初始化阶段根据映射元数据推导出来的.SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义 SQL语句,因此SessionFactory不需要进行内

Hibernate-二级缓存策略

二级缓存的策略 当多个并发的事务同时访问持久化层的缓存中的相同数据时,会引起并发问题,必须采用必要的事务隔离措施. 在进程范围或集群范围的缓存,即第二级缓存,会出现并发问题.因此可以设定以下4种类型的并发访问策略,每一种策略对应一种事务隔离级别. ●   只读缓存(read-only) 如果应用程序需要读取一个持久化类的实例,但是并不打算修改它们,可以使用read-only缓存.这是最简单,也是实用性最好的策略. 对于从来不会修改的数据,如参考数据,可以使用这种并发访问策略. ●   读/写缓存

mybatis学习笔记(14)-查询缓存之中的一个级缓存

mybatis学习笔记(14)-查询缓存之中的一个级缓存 mybatis学习笔记14-查询缓存之中的一个级缓存 查询缓存 一级缓存 一级缓存工作原理 一级缓存測试 一级缓存应用 本文主要讲mybatis的一级缓存.一级缓存是SqlSession级别的缓存. 查询缓存 mybatis提供查询缓存.用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级缓存是SqlSession级别的缓存.在操作数据库时须要构造sqlSession对象,在对象中有一个数据结构(HashMa

缓存篇(Cache)~第三回 HttpModule实现网页的文件级缓存

返回目录 再写完缓存篇第一回之后,得到了很多朋友的好评和来信,所以,决定加快步伐,尽快把剩下的文章写完,本篇是第三回,主要介绍使用HttpModule实现的文件级缓存,在看本文之前,大家需要限度HttpModule有一个了解,可以先看我的这篇文章<开发人员应该对IIS理论层的知识了解的多一些~第四讲 HttpModule中的几大事件> 对于文件级缓存来说,我们要知道两点,一为文件的URL,二为文件的 下面是HttpModuleCache的核心代码 /// <summary> ///

用guava快速打造两级缓存能力

首先,咱们都有一共识,即可以使用缓存来提升系统的访问速度! 现如今,分布式缓存这么强大,所以,大部分时候,我们可能都不会去关注本地缓存了! 而在一起高并发的场景,如果我们一味使用nosql式的缓存,如 redis, 那么也是好的吧! 但是有个问题我们得考虑下: redis 这样的缓存是快,但是它总有自己的瓶颈吧,如果什么东西我们都往里面存储,则在高并发场景下,应用瓶颈将受限于其缓存瓶颈吧! 所以,针对这种问题,在一些场景下,咱们可以使用本地缓存来存储一些数据,从而避免每次都将请求击穿到 redi

如何实现一个应用级缓存(上)

http://www.importnew.com/21570.html 缓存真的有效? 真的.嗯,根据计算机访问数据经常会呈现出的局部性原理.局部性原理又包括空间局部性和时间局部性.空间局部性就是说,计算机访问数据,而其存储在邻近的数据也经常会被访问.时间局部性就是说,在相对的一小段时间内,计算机经常会访问相同的数据.实际中是怎么运用局部性原理的呢,比如说,计算机从硬盘中读块,计算机不会只读你要的特定块,附近的快很有可能接下来要被访问,他会把这些块也一起预读出来.接下来要读附近的快的时候,就不需

spring 方法级缓存多种实现

方案实施 1. spring和ehcache集成 主要获取ehcache作为操作ehcache的对象. spring.xml中注入ehcacheManager和ehCache对象,ehcacheManager是需要加载ehcache.xml配置信息,创建ehcache.xml中配置不同策略的cache. <!-- ehCache 配置管理器 --> <bean id="ehcacheManager" class="org.springframework.ca

hibernate基础学习---hierbnate2级缓存

1:开启二级缓存sessionFactory需要安装jar包 2:在实体类配置文件添加(配置二级缓存).我的配置文件是Account.hbm.xml <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapp

hibernate......1、2级缓存

1.什么是缓存? 缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用程序的运行性能.Hibernate在进行读取数据的时候,根据缓存机制在相应的缓存中查询,如果在缓存中找到了需要的数据(我们把这称做"缓存命 中"),则就直接把命中的数据作为结果加以利用,避免了大量发送SQL语句到数据库查询的性能损耗. 缓存策略提供商: 提供了HashTable缓存,EHCache,OSCache,Swarm