• hibernate基础22:hibernate缓存


    1、缓存:提高执行效率。

    2、hibernate提供了3类缓存

      一级缓存:又称session缓存,线程级别的缓存,生命周期短

        Get方法/Load方法获取数据,先检查缓存中是否有该数据,如果有直接使用,如果没有从数据库中查询,并且写入缓存

        List方法获取数据,直接从数据库中获取,获取后将数据写入缓存

        Iterate方法获取数据,先获取取数据ID,如果使用数据再根据id查询数据,是一种延迟加载方式。获取数据时先检查缓存,如果有直接使用,如果缓存中没有到数据库中查询,再写入缓存

        注:1和N+1问题:1指list方法通过一条sql语句将所有数据查询出来,而iterate方法通过n+1条sql语句将数据查询,它们的不同在于加载数据的方式不同

        缓存的关联:一般不用关联一级缓存,如果在进行数据批量处理时需要管理缓存。管理缓存可以使用:evict(清除指定对象)、clear(清空缓存)、flush(刷新缓存)、close(关闭缓存)

      二级缓存:又称sessionFctory缓存,是进程级别的,生命周期较长,并且可以在集群中使用。缓存的数据比较多,当需要清理缓存时使用相关算法来进行清理。比如:LFU、LRU、FIFO等(https://blog.csdn.net/youanyyou/article/details/78989956

        hibernate二级缓存采用第三方提供的插件来实现(ehcache-core-2.4.3.jar、hibernate-ehcache-4.3.10.Final.jar、slf4j-api-1.6.1.jar)

        使用步骤:

          1)、导入jar包(hibernate-release-4.3.10.Finalliboptionalehcache)

          2)、添加ehcache.xml(hibernate-release-4.3.10.Finalprojectetc)至工程目录src下

    <ehcache>
    
        <diskStore path="java.io.tmpdir"/>
        
        <!-- 
            maxElementsInMemory    最多缓存个数
            eternal    是否永久存储
            timeToIdleSeconds    空闲时间
            timeToLiveSeconds    存活时间
            overflowToDisk    是否溢出到磁盘(缓存个数还未达到最大值,但缓存空间已满,true表示可以保存至磁盘)
            
         -->
        <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
            />
    
    </ehcache>

          3)、在hibernate.cfg.xml开启缓存

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        
        <session-factory>
            <!-- 1、数据库连接信息 -->
            <!-- 指定数据方言 -->
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.url">jdbc:mysql://192.168.1.59:3306/hibernate?characterEncoding=UTF8</property>
            <property name="connection.username">root</property>
            <property name="connection.password">1234</property>
            
            <!-- 2、通用配置信息 -->
            <!-- 打印sql语句 -->
            <property name="show_sql">true</property>
            <!-- 格式化sql语句 -->
            <property name="format_sql">true</property>
            
            <!-- 开启二级缓存 -->
            <property name="cache.use_second_level_cache">true</property>
            <property name="cache.provider_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
            <property name="cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
            
            <!-- 映射文件信息 -->
            <mapping resource="com/project/pojo/User.hbm.xml" />
        </session-factory >
    </hibernate-configuration>

        4)、在映射文件(hbm.xml)中使用缓存

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.project.pojo">
        <class name="User" table="t_user">
            <!-- 当前对象开启二级缓存 -->
            <cache usage="read-only"/>
            <id name="id" column="id" type="int">
                <generator class="native"></generator>
            </id>
            <property name="name" column="name" type="java.lang.String"></property>
            <property name="age" column="age" type="int"></property>
            
        </class>
    </hibernate-mapping>

      查询缓存:是在二级缓存的基础上使用

        1)、配置hibernate.cfg.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        
        <session-factory>
            <!-- 1、数据库连接信息 -->
            <!-- 指定数据方言 -->
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.url">jdbc:mysql://192.168.1.59:3306/hibernate?characterEncoding=UTF8</property>
            <property name="connection.username">root</property>
            <property name="connection.password">1234</property>
            
            <!-- 2、通用配置信息 -->
            <!-- 打印sql语句 -->
            <property name="show_sql">true</property>
            <!-- 格式化sql语句 -->
            <property name="format_sql">true</property>
            
            <!-- 开启二级缓存 -->
            <property name="cache.use_second_level_cache">true</property>
            <property name="cache.provider_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
            <property name="cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
            <!-- 开启查询缓存 -->
            <property name="cache.use_query_cache">true</property>
            
            
            <!-- 映射文件信息 -->
            <mapping resource="com/project/pojo/User.hbm.xml" />
        </session-factory >
    </hibernate-configuration>

        2)、开启查询缓存

    List<User> users = session.createQuery("from User")
                    .setCacheable(true)
                    .list();

  • 相关阅读:
    Luckysheet如何初始化含合并单元格的数据
    Luckysheet如何一键导入本地Excel
    又发现一款纯js开源电子表格Luckysheet
    Sublime Text3 注册码(Windows/Build 3176版本)| 开发工具
    Python初学者笔记(4)-简单的通讯录
    Python初学者笔记(3):输出列表中的奇数/奇数项,字符串中的偶数项,字符串大小写转换
    安装wampserver出现“The Program can't start because MSVCR110.dll is missing from your computer. Try reinstalling the program to fix this problem”
    python初学者笔记(2):阿拉伯数字转换成中文大写
    Python初学者笔记:打印出斐波那契数列的前10项
    JavaScript弹出对话框的三种方式
  • 原文地址:https://www.cnblogs.com/chai-blogs/p/13034135.html
Copyright © 2020-2023  润新知