为了使数据库压力更小,一般对实时性不高的数据采用延迟加载方式。什么叫延迟加载,比如:我们通过mapper接口调用查询的语句,然后在之后才对这个数据进行使用(比如输出),那么在输出的时候,数据库才会真正去运行这条语句返回查询的对象。
开启延迟加载的方式:
在association标签里加入select和column属性,select指向查询关联数据的方法,column指向在主表中关联的列(外键那列)。
在全局配置文件中配置
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
<setting name="cacheEnabled" value="false"/>
</settings>
settings标签配置在property下面,typeAlias上面。
延迟加载开关 | 全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。 | lazyLoadingEnabled | 默认为false |
---|---|---|---|
消极加载 | 当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。 | aggressiveLazyLoading | 默认为true |
二级缓存 | CLICK | cacheEnabled | 默认为false |
Mybatis默认开启一级缓存,在同一个SqlSession中,执行相同的查询SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行SQL时两次查询中间发生了增删改操作,则SqlSession的缓存清空。
SqlSession关闭也清空,比如一个service调用的结束,会关闭一个sqlsession,则缓存结束。
Mybatis需要手动设置启动二级缓存,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓存,添加:
<cache/>
二级缓存的作用域是同一个namespace下的mapper映射文件内容(HashMap),多个SqlSession共享。
在同一个namespace下的mapper文件中,执行相同的查询SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行SQL时两次查询中间发生了增删改操作,则二级缓存清空。
一个SqlSession关闭不会导致二级缓存清空,如果设置了二级缓存,service重复被调用查询同一条记录,只会一直从二级缓存中查询。
实现序列化
由于二级缓存的数据不一定都是存储到内存中,它的存储介质多种多样,所以需要给缓存的对象执行序列化。
如果该类存在父类,那么父类也要实现序列化。
设置禁用二级缓存
在select中添加属性useCache=”false”默认为true。
设置刷新二级缓存
在select中添加属性flushCache=”true”。
我们系统为了提高系统并发,性能、一般对系统进行分布式部署(集群部署方式)。
不使用分布缓存,缓存的数据在各各服务单独存储,不方便系统开发。所以要使用分布式缓存对缓存数据进行集中管理。
mybatis无法实现分布式缓存,需要和其它分布式缓存框架进行整合。
整合ehcache所需包:
设置mapper配置文件中
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
加入ehcache的配置文件ehcache.xml(classpath下):
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="F:\develop\ehcache" />
<defaultCache
maxElementsInMemory="1000"
maxElementsOnDisk="10000000"
eternal="false"
overflowToDisk="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>