分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

Hibernate 二级缓存配置

发布时间:2023-09-06 02:26责任编辑:熊小新关键词:配置缓存Hibernate

详见:https://www.cnblogs.com/Junsept/p/7324981.html

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缓存对象。

log1Hibernate: select category0_.id as id1_0_, category0_.name as name1_0_ from category category0_ where category0_.id=?log2log3
//一级缓存sessionSystem.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(); ?????????????//二级缓存SessionFactorySession 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>

Hibernate 二级缓存配置

原文地址:https://www.cnblogs.com/lukelook/p/10129704.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved