zoukankan      html  css  js  c++  java
  • Hibernate二级缓存配置

    Hibernate的cache管理:

      Cache就是缓存,它往往是提高系统性能的最重要手段,对数据起到一个蓄水池和缓冲的作用。Cache对于大量依赖数据读取操作的系统而言尤其重要。在大并发量的情况下,如果每次程序都需要向数据库直接做查询操作,它们所带来的性能开销是显而易见的,频繁的网络舆,数据库磁盘的读写操作都会大大降低系统的性能。此时如果能让数据库在本地内存中保留一个镜像,下次访问的时候只需要从内存中直接获取,那么显然可以带来不小的性能提升。引入Cache机制的难点是如何保证内存中数据的有效性,否则脏数据的出现将会给系统带来难以预知的严重后果。虽然一个设计得很好的应用程序不用Cache也可以表现出让人接受的性能,但毫无疑问,一些对读取操作要求比较高的应用程序可以通过Cache获得更高的性能。对于应用程序,Cache通过内存或磁盘保存了数据库中的当前有关数据状态,它是一个存储在本地的数据备份。Cache位于数据库和应用程序之间,从数据库更新数据,并给程序提供数据。

    Hibernate实现了良好的Cache机制,可以借助Hibernate内部的Cache迅速提高系统的数据读取性能。Hibernate中的Cache可分为两层:一级Cache和二级Cache。

    一级缓存:

    Hibernate默认是开启一级缓存的,一级缓存存放在session上,属于事务级数据缓冲。

    二级缓存:

    二级缓存是在SessionFactory,所有的Session共享同一个二级Cache。二级Cache的内部如何实现并不重要,重要的是采用哪种正确的缓存策略,以及采用哪个Cache提供器。

    在Hibernate中使用EhCache:

    1)hibernate.cfg.xml 中增加对二级缓存的配置(maven项目放在resources文件夹下)

    <?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>
            <!-- Database connection settings -->
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.url">jdbc:mysql://localhost:3306/test?characterEncoding=GBK</property>
            <property name="connection.username">root</property>
            <property name="connection.password">admin</property>
            <!-- SQL dialect -->
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
            <property name="current_session_context_class">thread</property>
            <property name="show_sql">true</property>
            <property name="hbm2ddl.auto">update</property>
             
            <property name="hibernate.cache.use_second_level_cache">true</property>
            <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
              
            <mapping resource="com/how2java/pojo/Product.hbm.xml" />
            <mapping resource="com/how2java/pojo/Category.hbm.xml" />
            <mapping resource="com/how2java/pojo/User.hbm.xml" />
             
        </session-factory>
     
    </hibernate-configuration>

    2)ehcache.xml用户EhCache配置(maven项目放在resources文件夹下)

    <ehcache>
        <diskStore path="java.io.tmpdir"/>
        <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
            />
    </ehcache>

    3)设置hbm

    对于要进行二级缓存的实体类,进行配置,增加
      1:事务(Transaction)仅在受管理的环境中可用。它保证可重读的事务隔离级别,可以对读/写比例高,很少更新的数据采用该策略。
      2:读写(read-write)使用时间戳机制维护读写提交事务隔离级别。可以对读/写比例高,很少更新的数据采用该策略。
      3:非严格读写(notstrict-read-write)不保证Cache和数据库之间的数据库的一致性。使用此策略时,应该设置足够的缓存过期时间,否则可能从缓存中读出脏数据。当一些数据极少改变,并且当这些数据和数据库有一部份不量影响不大时,可以使用此策略。
      4:只读(read-only)当确保数据永不改变时,可以使用此策略。

    <?xml version="1.0"?>
    <!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.domain">
        <class name="Category" table="category">
             <cache usage="read-write" /><!-- 二级缓存配置 -->
            <id name="id" column="id">
                <generator class="native">
                </generator>
            </id>
            <property name="name" column="name"/>
        </class>
         
    </hibernate-mapping>

    4)测试效果

    使用不同的session,都去获取id=1的category,只会访问一次数据库。因为第二次获取虽然没有从第二个session中拿到缓存,但是从sessionfactory中拿到了Category缓存对象。

    log1
    Hibernate: select category0_.id as id1_0_, category0_.name as name1_0_ from category category0_ where category0_.id=?
    log2
    log3
    //一级缓存session
    System.out.println("log1");
    Category c1 = (Category)session.get(Category.class, 1);
    System.out.println("log2");
    Category c2 = (Category)session.get(Category.class, 1);//不会显示SQL语句
    //提交事务  
    session.getTransaction().commit();              
    //二级缓存SessionFactory
    Session session2 = factory.openSession();
    session2.beginTransaction();
    System.out.println("log3");
    Category p3 = (Category) session2.get(Category.class, 1);//不会显示    
    session2.getTransaction().commit();

    5)注意事项

    maven所需包,hibernate 3.0版本,hibernate-ehcache

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>3.6.10.Final</version>
    </dependency>
    
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-ehcache</artifactId>
        <version>3.6.7.Final</version>
    </dependency>
  • 相关阅读:
    机器学习之逻辑回归
    机器学习之线性回归与模型保存
    机器学习之决策树
    机器学习之贝叶斯算法
    机器学习之KNN算法
    算法基础与开发流程
    特征选择与特征降维
    特征预处理
    RSA加密算法和签名算法
    Java中使用OpenSSL生成的RSA公私钥
  • 原文地址:https://www.cnblogs.com/Junsept/p/7324981.html
Copyright © 2011-2022 走看看