zoukankan      html  css  js  c++  java
  • mybatis入门-4 mybatis中的延迟加载和缓存

    什么是延迟加载:

      resultMap中的association和collection标签具有延迟加载的功能。延迟加载就是在我们关联查询的时候李勇延迟加载,先加载主信息,使用到关联信息的时候再去加载关联信息。通俗一点讲就是一个类里面引用另一个类,当使用到另一个类的时候另一个类再去赋值。

    设置延迟加载:

      在myabtis的全局配置文件里面配置全局加载 lazyLoadingEnabled、aggressiveLazyLoading

    <!-- 开启延迟加载 -->
        <settings>
            <!-- lazyLoadingEnabled:延迟加载启动,默认是false -->
            <setting name="lazyLoadingEnabled" value="true"/>
            <!-- aggressiveLazyLoading:积极的懒加载,false的话按需加载,默认是true -->
            <setting name="aggressiveLazyLoading" value="false"/>
             
        </settings>

    一级缓存:

      mybatis对缓存提供了支持,但是在没有配置的情况下,他只是默认的开启了第一缓存,一级缓存只是相对于SqlSession而言,所以在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SqlSession第一次查询后,Mybatis会把结果放到缓存中,下次查询只要没有声明刷新,没有做更新操作,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。

     

     一级缓存注意一下几点:

    1.一级缓存什么时候会清空:

      a.MyBatis在开启一个数据库会话时,会创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象。Executor对象中持有一个新的PerpetualCache对象,当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。

      b.如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用。

      c.如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用。

      d.SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用.

    2.在什么情况下会用调用缓存:

      当满足下列条件后,mybatis会认为两次查询为同一个查询,则会到缓存里面调用缓存。

      a. 传入的statementId是相同的

      b. 查询条件是相同的(查询时要求的结果集中的结果范围)

      c. 这次查询所产生的最终要传递给JDBC java.sql.Preparedstatement的Sql语句字符串(boundSql.getSql() )

      d. 传递给java.sql.Statement要设置的参数值

    二级缓存:

      MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。

      

       

      SqlSessionFactory 层面上的二级缓存默认是不开启的,耳机华润的开启需要进行配置。实现二级缓存的时候,Mybatis要求返回的POJO必须是序列化的。配置主需要在xml里面开启缓存就可以了:

      1.1 全局配置文件

    <!-- 开启延迟加载 -->
        <settings>
                
            <!-- 开启二级缓存,默认是false -->
            <setting name="cacheEnabled" value="true"/>
        </settings>

      1.2 自己的 mapper 文件

    <mapper namespace="cm.mbs.dao.BlogMapper">
        <!-- 开启不本mapper的namespace下的二级缓存 -->
        <cache/>

    第一次调用mapper下的SQL去查询用户信息。查询到的信息会存到该mapper对应的二级缓存区域内。

    第二次调用相同namespace下的mapper映射文件中相同的SQL去查询用户信息。会去对应的二级缓存内取结果。

    如果调用相同namespace下的mapper映射文件中的增删改SQL,并执行了commit操作。此时会清空该namespace下的二级缓存。

      

    二级缓存注意的点: 

    • 映射语句文件中的所有select语句将会被缓存。
    • 映射语句文件中的所有insert、update和delete语句会刷新缓存。
    • 缓存会使用默认的Least Recently Used(LRU,最近最少使用的)算法来收回。
    • 根据时间表,比如No Flush Interval,(CNFI没有刷新间隔),缓存不会以任何时间顺序来刷新。
    • 缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用
    • 缓存会被视为是read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全的被调用者修改,不干扰其他调用者或线程所做的潜在修改。
  • 相关阅读:
    android 75 新闻列表页面
    android 74 下载文本
    android 73 下载图片
    android 72 确定取消对话框,单选对话框,多选对话框
    android 71 ArrayAdapter和SimpleAdapter
    android 70 使用ListView把数据显示至屏幕
    maven如何将本地jar安装到本地仓库
    Centos6.7搭建ISCSI存储服务器
    解决maven打包编译出现File encoding has not been set问题
    MySQL 解决 emoji表情 的方法,使用utf8mb4 字符集(4字节 UTF-8 Unicode 编码)
  • 原文地址:https://www.cnblogs.com/L-o-g-i-c/p/11758311.html
Copyright © 2011-2022 走看看