Mybatis二级缓存的配置信息详细分析-----Mybatis框架

发布于:2023-09-22 ⋅ 阅读:(51) ⋅ 点赞:(0)
内存是临时存储数据的空间,断电后消失
硬盘:持久化的文件存储在硬盘当中,关机后文件仍旧保留
实际上,各大关系型数据库的数据都是存储在文件当中的
各大关系型数据库的数据都是存储在文件中的,mysql的信息通过orm映射成java对象
Mybatis的缓存机制,将SQL如select * from t_car where id = 1;
执行DQL语句的时候将查询结果放到缓存中,如果下次还是执行完全相同的DQL,就直接从缓存拿数据
目的在于提高查询效率和执行效率,减少查询数据库的次数
通过了减少IO的方式提速,IO:读文件和写文件
如果缓存读取的文件被修改了,那么mybatis就会自动清除缓存中保留的数据
缓存通常是我们程序开发中优化程序的重要手段,我们常用的缓存技术如下
字符串常量池(直接保存在字符串常量池,不需要重新创建)整数型常量池
线程池(创建多个线程放在里面)数据库连接池
在实际的生产环境下,多方面优化,缓存就是优化的一个方面,数据库表的索引的优化等等
缓存:提前把数据放到缓存中(内存),下一次用的时候,可以直接从缓存中取出来,提升了访问效率cache
mybatis提供了两级缓存
一级缓存,将数据存储到SqlSession中,二级缓存,将数据存储到SqlSessionFactory中
还可以集成其他第三方的缓存,比如EthCache(java开发的),MemCache(C语言开发的)
查询语句的信息存到SqlSession中(当前的一次会话),可以理解为一级缓存,如果存到SqlSessionFactory中,代表着一个环境(数据库environment)
如果执行的多个SQL都是一样的就直接从这个SqlSession中取信息,这就是一级缓存
缓存只针对DQL语句,DML语句必须连接数据库
默认情况下,Mybatis的二级缓存是开启的,只需要在对应的SqlMapper下添加标签即可
<!--    添加一个cache标签即可-->
除此以外,被查询出的结果对象还必须实现Serializable(序列化接口)
让它得以序列化才能实现
SqlSession对象被关闭或提交后,一级缓存的数据才会被写入到二级缓存,此时二级缓存才可用
当我们启用了二级缓存以后,二级缓存会引出一个缓存命中率的信息
一级缓存优先级更高,二级缓存是因为一级缓存已经关闭了,但还是需要数据我们才启用用来减少IO访问的
内存是临时存储数据的空间,断电后消失
硬盘:持久化的文件存储在硬盘当中,关机后文件仍旧保留
实际上,各大关系型数据库的数据都是存储在文件当中的
各大关系型数据库的数据都是存储在文件中的,mysql的信息通过orm映射成java对象
Mybatis的缓存机制,将SQL如select * from t_car where id = 1;
执行DQL语句的时候将查询结果放到缓存中,如果下次还是执行完全相同的DQL,就直接从缓存拿数据
目的在于提高查询效率和执行效率,减少查询数据库的次数
通过了减少IO的方式提速,IO:读文件和写文件
如果缓存读取的文件被修改了,那么mybatis就会自动清除缓存中保留的数据
缓存通常是我们程序开发中优化程序的重要手段,我们常用的缓存技术如下
字符串常量池(直接保存在字符串常量池,不需要重新创建)整数型常量池
线程池(创建多个线程放在里面)数据库连接池
在实际的生产环境下,多方面优化,缓存就是优化的一个方面,数据库表的索引的优化等等
缓存:提前把数据放到缓存中(内存),下一次用的时候,可以直接从缓存中取出来,提升了访问效率cache
mybatis提供了两级缓存
一级缓存,将数据存储到SqlSession中,二级缓存,将数据存储到SqlSessionFactory中
还可以集成其他第三方的缓存,比如EthCache(java开发的),MemCache(C语言开发的)
查询语句的信息存到SqlSession中(当前的一次会话),可以理解为一级缓存,如果存到SqlSessionFactory中,代表着一个环境(数据库environment)
如果执行的多个SQL都是一样的就直接从这个SqlSession中取信息,这就是一级缓存
缓存只针对DQL语句,DML语句必须连接数据库
默认情况下,Mybatis的二级缓存是开启的,只需要在对应的SqlMapper下添加标签即可
<!--    添加一个cache标签即可-->
除此以外,被查询出的结果对象还必须实现Serializable(序列化接口)
让它得以序列化才能实现
SqlSession对象被关闭或提交后,一级缓存的数据才会被写入到二级缓存,此时二级缓存才可用
当我们启用了二级缓存以后,二级缓存会引出一个缓存命中率的信息
一级缓存优先级更高,二级缓存是因为一级缓存已经关闭了,但还是需要数据我们才启用用来减少IO访问的
<?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.powernode.mybatis.mappers.CarMapper">
<!--    添加一个cache标签即可-->
<!--    eviction驱逐,flushInterval刷新间隔(如果不配置就不刷新),到时间自动刷新二级缓存,size规定存储的java对象的上限-->
<!--    eviction配置:LRU(最近较少使用)LFU(最不常用,从大的总范围看,不常使用的数据内容)FIFO(先进先出)SOFT(淘汰软引用指向的对象)-->
<!--    WEAK(淘汰弱引用的对象)-->
<!--    readOnly如果是true表示执行sql语句后返回的对象是同一个,性能好但是多线程并发会出现安全问题-->
<!--    false时sql返回的对象是副本,调用了clone方法,性能一般,但是安全-->
    <cache eviction="LRU" flushInterval="2000" size="1024" readOnly="false"></cache>
    <select id="selectById" resultType="Car">
        select * from t_car where id = #{id}
    </select>
    <insert id="insertClazz">
        insert into t_clazz values(#{cid},#{cname})
    </insert>
    <select id="selectByIdSecondCache" resultType="Car">
        select * from t_car where id = #{id}
    </select>
</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="com.powernode.mybatis.mappers.CarMapper">
<!--    添加一个cache标签即可-->
<!--    eviction驱逐,flushInterval刷新间隔(如果不配置就不刷新),到时间自动刷新二级缓存,size规定存储的java对象的上限-->
<!--    eviction配置:LRU(最近较少使用)LFU(最不常用,从大的总范围看,不常使用的数据内容)FIFO(先进先出)SOFT(淘汰软引用指向的对象)-->
<!--    WEAK(淘汰弱引用的对象)-->
<!--    readOnly如果是true表示执行sql语句后返回的对象是同一个,性能好但是多线程并发会出现安全问题-->
<!--    false时sql返回的对象是副本,调用了clone方法,性能一般,但是安全-->
    <cache eviction="LRU" flushInterval="2000" size="1024" readOnly="false"></cache>
    <select id="selectById" resultType="Car">
        select * from t_car where id = #{id}
    </select>
    <insert id="insertClazz">
        insert into t_clazz values(#{cid},#{cname})
    </insert>
    <select id="selectByIdSecondCache" resultType="Car">
        select * from t_car where id = #{id}
    </select>
</mapper>
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到