<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.powernode</groupId> <artifactId>mybatis-011-cache</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency> <dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.2.3</version> </dependency> </dependencies> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> </project>
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.powernode</groupId> <artifactId>mybatis-011-cache</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency> <dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.2.3</version> </dependency> </dependencies> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> </project>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false"> <diskStore path="c://ehcache"/> <!--defaultCache:echcache的默认缓存策略 --> <!-- name:cache唯一标识 eternal:缓存是否永久有效 maxElementsInMemory:内存中最大缓存对象数 overflowToDisk(true,false):缓存对象达到最大数后,将缓存写到硬盘中 diskPersistent:硬盘持久化 timeToIdleSeconds:缓存清除时间 timeToLiveSeconds:缓存存活时间 diskExpiryThreadIntervalSeconds:磁盘缓存的清理线程运行间隔 memoryStoreEvictionPolicy:缓存清空策略 1.FIFO:first in first out 先进先出 2.LFU: Less Frequently Used 一直以来最少被使用的 3.LRU:Least Recently Used 最近最少使用的 persistence strategy 如果内存满了,溢出到硬盘 --> <defaultCache maxElementsInMemory="1000" eternal="false" overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"> <persistence strategy="localTempSwap"/> </defaultCache> </ehcache>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false"> <diskStore path="c://ehcache"/> <!--defaultCache:echcache的默认缓存策略 --> <!-- name:cache唯一标识 eternal:缓存是否永久有效 maxElementsInMemory:内存中最大缓存对象数 overflowToDisk(true,false):缓存对象达到最大数后,将缓存写到硬盘中 diskPersistent:硬盘持久化 timeToIdleSeconds:缓存清除时间 timeToLiveSeconds:缓存存活时间 diskExpiryThreadIntervalSeconds:磁盘缓存的清理线程运行间隔 memoryStoreEvictionPolicy:缓存清空策略 1.FIFO:first in first out 先进先出 2.LFU: Less Frequently Used 一直以来最少被使用的 3.LRU:Least Recently Used 最近最少使用的 persistence strategy 如果内存满了,溢出到硬盘 --> <defaultCache maxElementsInMemory="1000" eternal="false" overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"> <persistence strategy="localTempSwap"/> </defaultCache> </ehcache>
<?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>--> <!-- 指定我们使用的Ehcache--> <cache type="org.mybatis.caches.ehcache.EhcacheCache"></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>--> <!-- 指定我们使用的Ehcache--> <cache type="org.mybatis.caches.ehcache.EhcacheCache"></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>
内存是临时存储数据的空间,断电后消失 硬盘:持久化的文件存储在硬盘当中,关机后文件仍旧保留 实际上,各大关系型数据库的数据都是存储在文件当中的 各大关系型数据库的数据都是存储在文件中的,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访问的 引入集成EhCache是为了替代mybatis自带的二级缓存,一级缓存是无法替代的 mybatis对外提供了接口
内存是临时存储数据的空间,断电后消失 硬盘:持久化的文件存储在硬盘当中,关机后文件仍旧保留 实际上,各大关系型数据库的数据都是存储在文件当中的 各大关系型数据库的数据都是存储在文件中的,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访问的 引入集成EhCache是为了替代mybatis自带的二级缓存,一级缓存是无法替代的 mybatis对外提供了接口
本文含有隐藏内容,请 开通VIP 后查看