发表于: 2017-11-13 21:02:53
1 979
今天完成的事情:在mybatis中配置和使用延迟加载,以及缓存
延迟加载:
采用了昨天设计的省份和城市之间的关联查询来模拟。
1.直接查询
配置文件,在mybatis.xml主配置文件中的lazyLoadingEnabled属性置为false,即关闭延迟加载。
test方法
查询结果,通过日志记录可以看出,没有访问主加载对象,select语句执行了两次。
2.侵入式延迟加载
需要在主配置文件中配置
test方法
查询结果,可以看出在只查询province,未访问province(主加载对象)的情况下,程序只会去数据库中进行一次查询
当访问province时,test方法,此时访问了province的name属性。
查询结果
可以看出,访问province时,程序会再次向数据库进行一次查询。即在查询主加载对象时,并不会对关联对象进行查询,而当访问主加载对象详情时,才会对关联对象进行查询
3.深度延迟加载
主配置文件
test方法
查询结果,即便访问主加载对象的详情,也并未对关联对象进行查询。
test方法修改为:此时得到province的city属性
查询结果
可以看出,深度延迟加载只有在访问关联对象的详情时,才会再一次去数据库中进行查询。
一级缓存:是按照namespace划分的,作用域是SqlSession,在同一个SqlSession中两次执行相同的sql查询语句,第一次执行完毕后,会将查询结果写入到缓存中,第二次会从缓存中直接获取数据,而不再到数据库中进行查询。Mybatis默认开启一级缓存。
查询结果:可以看出只去数据库中查询了一次
一级缓存的生命周期:
查询结果,可以看出,执行了两次查询,验证了一级缓存只在同一个SqlSession中有效
执行增删改对一级缓存的影响:
增:
查询结果:可以看出,虽然增过程没有commit,但还是刷新了一级缓存,导致第二次查询时,缓存中没有上次查询存储的数据,从而再一次去数据库中进行查询。
删和改同理
此外,需要注意的是:执行相同的sql语句,但由于不是同一个<select>标签内,也就是说select标签的id不同
查询结果
从上可以看出,一个执行了两次查询,也就是说,mybatis存储一级缓存的依据是select标签的id属性,而非sql语句。
二级缓存,也是按照namespace划分的,二级缓存的生命周期与整个应用同步,与SqlSession是否关闭无关。
二级缓存的使用需要:javaBean实现Serializable接口,mapper映射文件添加<cache />标签
<cache />标签中有4个属性,如果不设置,就为默认值。
eviction:逐出策略。当二级缓存中的对象达到最大值时,需要通过逐出策略将缓存对象中的对象移出。默认为LRU,常用的策略
FIFO:First In First Out,先进先出
LRU:Least Recently Used,未被使用时间最长的
flushInterval:刷新缓存的时间间隔,单位毫秒。这里的刷新缓存即清空缓存
readOnly:设置缓存中的数据是否只读,默认为false。
size:二级缓存中存放的最多对象个数。默认为1024
test方法:
查询结果:
可以看出,整个查询过程只执行了一次sql语句的查询。蓝色方框内,表示缓存命中率,第一次查询由于缓存中没有数据,所以为0.0,查询之后会把数据存储在缓存中,第二次查询可以直接从缓存中读取数据,所以第二次的缓存命中率为0.5。此外,在test方法中,执行完第一次查询之后,SqlSession已经被关闭,也就是说两次的查询不是在同一个SqlSession下进行的,证明了二级缓存的生命周期与SqlSession是否关闭无关。
增删改操作对二级缓存的影响:以删为例
查询结果:
可以看出,删除的操作是会影响二级缓存的。增删改操作,无论是否进行sqlSession.commit(),均会清空一级、二级缓存,使得查询再次从数据库中select。
但是,通过mapper映射文件的配置,可以使得某个增删改操作不清除二级缓存。对某个操作配置flushCache属性设置为false,可以不清除二级缓存
查询结果:
可以看出,虽然进行了删除操作,但并未影响二级缓存,select语句只执行了一次。
二级缓存默认为开启状态。若要将其关闭,则需要进行相关设置。有两种方法可以使用:
1.可以在主配置文件中设置为全局关闭:
2.也可以在mapper映射文件中对需要的select查询进行关闭,将useCache属性置为false即可。
在mybatis中可以使用第三方缓存产品ehcache来管理缓存。需要将相关jar添加到路径
需要添加ehcache.xml文件到src目录,ehcache.xml文件可以通过解压ehcache-x.x.x.jar文件,在里面有一个ehcache-failsafe.xml文件,将其复制一份,名称修改为ehcache.xml即可。
ehcache缓存不需要javaBean实现Serializable接口。
需要在mapper映射文件中对缓存进行设置
在ehcache.xml文件中,对缓存的属性进行了默认设置:
如果想对这些设置进行更改,可以在mapper映射文件中的cache标签下进行更改。
property标签中的name属性可以根据ehcache.xml文件中等号左边的值进行设置,value属性根据自己的需要进行设置。<cache>中属性的优先级高于ehcache.xml中的属性值。
示例:使用ehcache.xml文件中默认的值
test方法:
查询结果:
可以看出select语句只执行了一次,程序中存在二级缓存。
明天的计划:买了一本linux服务器架设的书,已经到了,自己稍微看了一点,发现有些命令不懂,明天计划先弄懂需要使用到的linux的命令的含义,进行服务器的搭建。
遇到的问题:在使用ehcache缓存时,发现控制台有输出结果,但是日记却没有输出,后来查询发现,缺少这个jar:slf4j-log4j12-1.7.7.jar,导入后正常工作。
收获:mybatis这部分的概念以及一些简单使用基本上清楚了,这些也都比较基础。基础扎实了,以后碰到逻辑复杂的问题才能解决。
评论