内存是临时存储数据的空间,断电后消失 硬盘:持久化的文件存储在硬盘当中,关机后文件仍旧保留 实际上,各大关系型数据库的数据都是存储在文件当中的 各大关系型数据库的数据都是存储在文件中的,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 后查看