【mybatis】学习总结(三)


延迟加载

为了使数据库压力更小,一般对实时性不高的数据采用延迟加载方式。什么叫延迟加载,比如:我们通过mapper接口调用查询的语句,然后在之后才对这个数据进行使用(比如输出),那么在输出的时候,数据库才会真正去运行这条语句返回查询的对象。

开启延迟加载的方式:

  • 使用association实现延迟加载

在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

我们系统为了提高系统并发,性能、一般对系统进行分布式部署(集群部署方式)。

不使用分布缓存,缓存的数据在各各服务单独存储,不方便系统开发。所以要使用分布式缓存对缓存数据进行集中管理。

mybatis无法实现分布式缓存,需要和其它分布式缓存框架进行整合。

  • 整合方法:

整合ehcache所需包:

  • ehcache-core-2.6.11.jar
  • mybatis-ehcache-1.1.0.jar

设置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>