1、二级缓存所需要的 jar 包

这三个 jar 包实在 hibernate 解压缩文件夹的 lib\optional\ehcache 目录下

2、配置 ehcache.xml

  1. <ehcache>
  2.  
  3. <!-- 指定当缓存数据超出规定缓存大小的时候,超出的缓存数据写入到磁盘的位置 -->
  4. <diskStore path="D:/cache/tmp"/>
  5. <!--
  6. maxInMemory - 允许在二级缓存中的持久化对象数量
  7. eternal - 缓存中的持久化对象是否允许销毁 false:表示可以销毁
  8. timeToIdleSeconds - 当激活时间到期,持久化对象可以存活的时间(钝化时间)
  9. timeToLiveSeconds - 缓存中对象的激活时间(有效时间)
  10. overflowToDisk - 是否允许缓存数据序列化到磁盘
  11. -->
  12. <defaultCache
  13. maxElementsInMemory="10"
  14. eternal="false"
  15. timeToIdleSeconds="120"
  16. timeToLiveSeconds="120"
  17. overflowToDisk="true"
  18. />
  19. </ehcache>

3、配置 hibernate.cfg.xml

在配置文件添加如下代码:

<property name="hibernate.cache.use_second_level_cache">true</property>

<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

具体如下:

  1. <!DOCTYPE hibernate-configuration PUBLIC
  2. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  3. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  4.  
  5. <hibernate-configuration>
  6. <session-factory>
  7. <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
  8. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  9. <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
  10. <property name="hibernate.connection.username">root</property>
  11. <property name="hibernate.connection.password">123456</property>
  12. <property name="hibernate.hbm2ddl.auto">update</property>
  13. <property name="hibernate.show_sql">true</property>
  14. <!-- 二级缓存配置 -->
  15. <!-- 开启二级缓存(默认是开启二级缓存的) -->
  16. <property name="hibernate.cache.use_second_level_cache">true</property>
  17. <!-- 配置二级缓存的视实现类(第三方插件包) 以下这个缓存类的包路径是错误的
  18. <property name="hibernate.cache.region.factory_class">org.hibernate.cache.internal.EhCacheRegionFactory</property> -->
  19. <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
  20. <mapping resource="learn\hibernate\bean\Person.hbm.xml"/>
  21. </session-factory>
  22. </hibernate-configuration>

4、支持二级缓存持久化类配置,有两种配置方式

第一种在持久化配置文件中配置:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="learn.hibernate.bean">
  6. <class name="Person" table="t_person">
  7. <!-- 配置持久化类支持二级缓存的读写操作 -->
  8. <cache usage="read-write"/>
  9. <id name="id" column="person_id">
  10. <generator class="native"/>
  11. </id>
  12. <property name="name" column="t_name"/>
  13. <property name="age"/>
  14. <property name="passwork"/>
  15. <property name="birthday"/>
  16. </class>
  17. </hibernate-mapping>

第二种在 hibernate.cfg.xml 文件中配置:

  1. <!DOCTYPE hibernate-configuration PUBLIC
  2. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  3. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  4.  
  5. <hibernate-configuration>
  6. <session-factory>
  7. <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
  8. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  9. <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
  10. <property name="hibernate.connection.username">root</property>
  11. <property name="hibernate.connection.password">123456</property>
  12. <property name="hibernate.hbm2ddl.auto">update</property>
  13. <property name="hibernate.show_sql">true</property>
  14. <!-- 二级缓存配置 -->
  15. <!-- 开启二级缓存(默认是开启二级缓存的) -->
  16. <property name="hibernate.cache.use_second_level_cache">true</property>
  17. <!-- 配置二级缓存的视实现类(第三方插件包) 以下这个缓存类的包路径是错误的
  18. <property name="hibernate.cache.region.factory_class">org.hibernate.cache.internal.EhCacheRegionFactory</property> -->
  19. <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
  20. <mapping resource="learn\hibernate\bean\Person.hbm.xml"/>
  21. <!--
  22. 持久化类的二级缓存配置:
  23. 1、在持久化类配置文件中配置 <cache usage="read-write"/>
  24. 2、在 hibernate.cfg.xml 文件中配置,如下:(推荐)
  25. -->
  26. <class-cache usage="read-write" class="learn.hibernate.bean.Person"/>
  27. </session-factory>
  28. </hibernate-configuration>

5、代码测试

  1. /**
  2. * 在配置二级缓存的查询中步骤如下:
  3. * 先搜索 一级缓存------> 二级缓存 ------> SQL查询-------> 将数据写入缓存中
  4. * 二级缓存是可以在多个 session 中共享的
  5. * get()、load() 方法支持二级缓存的 读写 操作
  6. */
  7. @Test
  8. public void testQuery(){
  9. session = factory.openSession();
  10. Person p = (Person)session.get(Person.class, 1);
  11. System.out.println(p);
  12. session.close();
  13. System.out.println("-------------------");
  14. session = factory.openSession();
  15. Person p2 = (Person)session.get(Person.class, 1);
  16. System.out.println(p2);
  17. session.close();
  18. }
  19.  
  20. /**
  21. * list() 方法支持二级缓存的写,不支持读
  22. */
  23. @Test
  24. public void testQuery2(){
  25. String hql = "from Person";
  26.  
  27. session = factory.openSession();
  28. Query query = session.createQuery(hql);
  29. List<Person> list = query.list();
  30. for(Person p : list){
  31. System.out.println(p);
  32. }
  33. session.close();
  34.  
  35. System.out.println("---------------------------");
  36. session = factory.openSession();
  37. Query query2 = session.createQuery(hql);
  38. List<Person> list2 = query2.list();
  39. for(Person p : list2){
  40. System.out.println(p);
  41. }
  42. session.close();
  43.  
  44. System.out.println("---------------------------");
  45. session = factory.openSession();
  46. Person p = (Person)session.get(Person.class, 6);
  47. System.out.println(p);
  48. session.close();
  49. }
  50.  
  51. /**
  52. * iterate() 方法支持二级缓存的写读操作
  53. */
  54. @Test
  55. public void testQuery3(){
  56. String hql = "from Person";
  57.  
  58. session = factory.openSession();
  59. Query query = session.createQuery(hql);
  60. Iterator<Person> it = query.iterate();
  61. while(it.hasNext()){
  62. System.out.println(it.next());
  63. }
  64. session.close();
  65.  
  66. System.out.println("---------------------------");
  67. session = factory.openSession();
  68. Query query2 = session.createQuery(hql);
  69. Iterator<Person> it2 = query2.iterate();
  70. while(it2.hasNext()){
  71. System.out.println(it2.next());
  72. }
  73. session.close();
  74.  
  75. System.out.println("---------------------------");
  76. session = factory.openSession();
  77. Person p = (Person)session.get(Person.class, 6);
  78. System.out.println(p);
  79. session.close();
  80. }

6、二级缓存的管理

  1. /**
  2. * 二级缓存的管理
  3. *
  4. */
  5. @Test
  6. public void testQuery() throws InterruptedException{
  7. String hql = "from Person";
  8.  
  9. session = factory.openSession();
  10. // 获得二级缓存的操作句柄(对象)
  11. Cache cache = factory.getCache();
  12. Query query = session.createQuery(hql);
  13. Iterator<Person> it = query.iterate();
  14. while(it.hasNext()){
  15. System.out.println(it.next());
  16. }
  17. System.out.println("--------------------------");
  18. // 判断缓存中是否存在该条数据
  19. boolean flag = cache.containsEntity(Person.class, 7);
  20. System.out.println(flag);
  21. // 将持久化类从缓存中剔除
  22. cache.evictEntity(Person.class, 7);
  23. // 将一个持久化类型从缓存中全部剔除
  24. cache.evictEntityRegion(Person.class);
  25. session.close();
  26.  
  27. }

7、验证超出规定数量的持久化对象会不会被写入到指定的目录下

  1. package learn.hibernate.test;
  2.  
  3. import static org.junit.Assert.*;
  4.  
  5. import java.util.Iterator;
  6. import java.util.List;
  7.  
  8. import learn.hibernate.bean.Person;
  9.  
  10. import org.hibernate.Query;
  11. import org.hibernate.Session;
  12. import org.hibernate.SessionFactory;
  13. import org.hibernate.Transaction;
  14. import org.hibernate.cfg.Configuration;
  15. import org.hibernate.service.ServiceRegistry;
  16. import org.hibernate.service.ServiceRegistryBuilder;
  17. import org.junit.After;
  18. import org.junit.Before;
  19. import org.junit.Test;
  20.  
  21. public class TestHibernate2 {
  22.  
  23. SessionFactory factory = null;
  24. Session session = null;
  25. Transaction tx = null;
  26.  
  27. /**
  28. * 测试之前初始化数据
  29. * @throws Exception
  30. */
  31. @SuppressWarnings("deprecation")
  32. @Before
  33. public void setUp() throws Exception {
  34. System.out.println("---------初始化数据----------");
  35.  
  36. Configuration config = new Configuration().configure();
  37. ServiceRegistry sr = new ServiceRegistryBuilder()
  38. .applySettings(config.getProperties()).buildServiceRegistry();
  39. factory = config.buildSessionFactory(sr);
  40. //session = factory.openSession();
  41. }
  42.  
  43. /**
  44. * 测试之后释放(销毁)数据
  45. * @throws Exception
  46. */
  47. @After
  48. public void tearDown() throws Exception {
  49. System.out.println("---------释放数据----------");
  50. /*if(session.isOpen()){
  51. session.close();
  52. }*/
  53. }
  54.  
  55. /**
  56. * 测试缓存中的对象数量大于配置文件后,是否会将多余的对象写入到在磁盘上生成文件
  57. * 关闭 factory 是否会将磁盘文件释放删除
  58. * @throws InterruptedException
  59. */
  60. @Test
  61. public void testQuery() throws InterruptedException{
  62. String hql = "from Person";
  63.  
  64. session = factory.openSession();
  65. Query query = session.createQuery(hql);
  66. Iterator<Person> it = query.iterate();
  67. while(it.hasNext()){
  68. System.out.println(it.next());
  69. }
  70. session.close();
  71. System.out.println("--------sleep-start------");
  72. // 为了观察二级缓存序列化操作过程,让程序暂停短暂时间,观察磁盘文件是否生成
  73. Thread.sleep(10000);
  74. System.out.println("--------sleep-end------");
  75. factory.close();
  76. }
  77. }

8、查询缓存

首先要做 hibernate.cfg.xml 文件中配置如下代码:

<property name="hibernate.cache.use_query_cache">true</property>

开启查询缓存,默认情况下查询缓存是关闭的;查询缓存是基于二级缓存的

测试:

  1. /**
  2. * 只有 list() 支持查询缓存,其他的方法不支持
  3. * 查询缓存的生命周期是很短暂的,即便查询条件的值发生变化也会重新查询
  4. *
  5. */
  6. @Test
  7. public void testQuery2(){
  8. String hql = "from Person";
  9.  
  10. session = factory.openSession();
  11. Query query = session.createQuery(hql);
  12. /**
  13. * 启动查询缓存
  14. * 告诉 hibernate 先到查询缓存中搜索有没有相同的查询语句查询过,有就将之前的查询结果直接返回
  15. */
  16. query.setCacheable(true);
  17. List<Person> list = query.list();
  18. for(Person p : list){
  19. System.out.println(p);
  20. }
  21. session.close();
  22.  
  23. System.out.println("---------------------------");
  24. session = factory.openSession();
  25. Query query2 = session.createQuery(hql);
  26. // 如果查询没有变,那么接下来的查询结果将从上一次的查询中获取
  27. query2.setCacheable(true);
  28. query2.setCacheable(true);
  29. List<Person> list2 = query2.list();
  30. for(Person p : list2){
  31. System.out.println(p);
  32. }
  33. session.close();
  34. }

9、hibernate 的优化

(1)、使用 Configuration 装载映射文件时,不要使用绝对路径装载。最好的方式是通过 getResourceAsStream() 装载映射文件,这样 hibernate 会从 classpath 中寻找已配置的映射文件。

(2)、SessionFactory 的创建非常消耗资源,整个应用一般只要一个 SessionFactory 就够了,只有多个数据库的时候才会使用多个 SessionFactory。

(3)、在整个应用中,Session 和事务应该能够统一管理。(Spring 为 Hibernate 提供了很好的支持)

(4)、将所有的集合属性配置设为懒加载(lazy=true)

(5)、在定义关联关系时,集合首选 Set,如果集合中的实体存在重复,则选择 List(定义配置文件时,可以将 List定义为 idbag),数组的性能最差。

(6)、在一对多的双向关联中,一般将集合的 inverse 属性设置为 true,让集合的对方维护关联关系。例如:Person-Address,由 Address 来维护 Person 和 Address 的关联关系。

让拥有外键的一端来进行关联关系的维护比较好

(7)、在执行更新的时候尽量配置 dynamic-update=”true”,表示没有修改的属性不参与更新操作

(8)、HQL 子句本身大小写无关,但是其中出现的类名和属性名必须注意大小写区分

(9)、如果可以,使用乐观锁代替悲观锁

(10)、如果要很好的掌握 Hibernate,熟练掌握关系数据理论和 SQL 是前提条件

Hibernate学习---第十五节:hibernate二级缓存的更多相关文章

  1. 风炫安全WEB安全学习第二十五节课 利用XSS键盘记录

    风炫安全WEB安全学习第二十五节课 利用XSS键盘记录 XSS键盘记录 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源.所以xyz.com下的js脚本采用a ...

  2. hibernate学习笔记第七天:二级缓存和session管理

    二级缓存配置 1.导入ehcache对应的三个jar包 ehcache/*.jar 2.配置hibernate使用二级缓存 2.1设置当前环境开始二级缓存的使用 <property name=& ...

  3. Hibernate学习---第十四节:hibernate之session线程安全

    1.hibernate.cfg.xml 文件中添加如下代码开启线程安全: <property name="hibernate.current_session_context_class ...

  4. hibernate学习(9)——日志,一对一,二级缓存

    1.Hibernate中的日志 1  slf4j 核心jar  : slf4j-api-1.6.1.jar .slf4j是日志框架,将其他优秀的日志第三方进行整合. 整合导入jar包 log4j 核心 ...

  5. Hibernate学习笔记(五)—— Hibernate查询方式

    一.对象图导航查询 对象图导航查询方式是根据已经加载的对象,导航到他的关联对象.它利用类与类之间的关系来查询对象.比如要查找一个联系人对应的客户,就可以由联系人对象自动导航找到联系人所属的客户对象.当 ...

  6. Hibernate学习---第十三节:hibernate过滤器和拦截器的实现

    一.hibernate 过滤器 1.在持久化映射文件中配置过滤器,代码如下: <?xml version="1.0"?> <!DOCTYPE hibernate- ...

  7. 风炫安全Web安全学习第十六节课 高权限sql注入getshell

    风炫安全Web安全学习第十六节课 高权限sql注入getshell sql高权限getshell 前提条件: 需要知道目标网站绝对路径 目录具有写的权限 需要当前数据库用户开启了secure_file ...

  8. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  9. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

随机推荐

  1. 【JMeter4.0学习(九)】之定时器

    目录: 固定定时器 高斯随机定时器 附 一.固定定时器 1.添加线程组 2.添加固定定时器 3.添加HTTP请求 4.添加结果树以及运行  二.高斯随机定时器 1.添加线程组 2.添加高斯随机定时器 ...

  2. Android Handler警告,SimpleDateFormat警告

    1:Handler// This Handler class should be static or leaks might occur: IncomingHandler    @SuppressLi ...

  3. MongoDBTemplate多条件查询的问题

    问题: 在使用Spring Data MongoDB 进行条件查询数据时,发现条件判断不起作用,结果会返回所有的数据. Criteria criteria = new Criteria(); crit ...

  4. MySQL复制经常使用拓扑结构具体解释

    复制的体系结构有下面一些基本原则: (1)    每一个slave仅仅能有一个master: (2)    每一个slave仅仅能有一个唯一的serverID: (3)    每一个master能够有 ...

  5. 频繁加载、删除swf造成flash崩溃解决办法

    最近在项目中遇到flash崩溃问题,经分析,都是在swfobject.embedSWF这一步卡死,页面及flash均无反应.   造成此问题的场景是,在同一根节点上频繁清空节点.调用swfobject ...

  6. POJ 2965 The Pilots Brothers' refrigerator【枚举+dfs】

    题目:http://poj.org/problem?id=2965 来源:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=26732#pro ...

  7. 经典的css reset代码 (reset.css)

    <style> html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, ...

  8. Centos设置开机启动Apache和Mysql

    先用chkconfig --list查询apache和mysql服务是否存在,不存在则需要手动添加 [root@centos64 vsftpd]# chkconfig --list 测试存在,只需要开 ...

  9. mysql mariadb 乱码

    mysql 创建临时表 CREATE TEMPORARY TABLE tmp_table SELECT COUNT(*) AS num FROM student_info GROUP BY LEFT( ...

  10. liferay 指定默认首页

    1.登录liferay后,点击控制面板-->设置--> portal设置 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ3hpbmdf ...