博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate的检索策略
阅读量:4310 次
发布时间:2019-06-06

本文共 1213 字,大约阅读时间需要 4 分钟。

      Hibernate的Session在加载一个Java对象时,可以将与这个对象相关联的其他Java对象都加载到缓存中,以便程序及时调用。但有些情况下,我们不需要加载太多无用的对象到缓存中,一来这样会撑爆内存,二来增加了访问数据库的次数。所以为了合理的使用缓存,Hibernate提供了几种检索策略来供用户选择。

Hibernate的检索策略

      在Hibernate中主要有三种检索策略,它们是立即检索策略、延迟检索策略、左外连接检索策略。下面分别介绍一下这三种检索策略。

立即检索策略

      采用立即检索策略,会将被检索的对象,以及和这个对象关联的一对多对象都加载到缓存中。Session的get方法就使用的立即检索策略。

      优点:频繁使用的关联对象能够被加载到缓存中。

      缺点:1、占用内存。2、Select语句过多。

延迟检索策略

      采用延迟检索策略,就不会加载关联对象的内容直到第一次调用关联对象时,才去加载关联对象。在不涉及关联类操作时,延迟检索策略只适用于Session的load方法涉及关联类操作时,延迟检索策略也能够适用于get,list等操作

      在类级别操作时, 延迟检索策略,只加载类的OID不加载类的其他属性,只用当第一次访问其他属性时,才回访问数据库去加载内容。(这里使用了CGLIB生成了类的代理类)

      在关联级别操作时,延迟检索策略,只加载类本身,不加载关联类,直到第一次调用关联对象时,才去加载关联对象

      程序模式都是用延迟加载策略。如果需要指定使用延迟加载策略。在配置文件中设置<class>的lazy=true,<set>的lazy=true或extra(增强延迟)<many-to-one>的lazy=proxy和no-proxy。

      优点:由程序决定加载哪些类和内容,避免了大量无用的sql语句和内存消耗。

      缺点:在Session关闭后,就不能访问关联类对象了。 需要确保在Session.close方法前,调用关联对象。 

左外连接检索策略:

      采用左外连接检索,能够使用Sql的外连接查询,将需要加载的关联对象加载在缓存中。

      <set>fetch设置为join,<many-to-one>的fetch设置为 join

      优点:1.对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便的从一个对象导航到与它关联的对象。2.使用了外连接,select语句数目少。

       缺点:1.可能会加载应用程序不需要访问的对象,白白浪费许多内存空间。2.复杂的数据库表连接也会影响检索性能。 

batch-size属性:

       无论是立即检索还是延迟检索,都可以指定关联查询的数量,这就需要使用batch-size属性来指定,指定关联查询数量,以减少批量检索的数据数目。

转载于:https://www.cnblogs.com/wukong0214/archive/2013/01/23/2874026.html

你可能感兴趣的文章
echarts 为例讲解 uni-app 如何引用 npm 第三方库
查看>>
uni-app跨页面、跨组件通讯
查看>>
springmvc-helloworld(idea)
查看>>
JDK下载(百度网盘)
查看>>
idea用得溜,代码才能码得快
查看>>
一篇掌握python魔法方法详解
查看>>
数据结构和算法5-非线性-树
查看>>
数据结构和算法6-非线性-图
查看>>
数据结构和算法7-搜索
查看>>
数据结构和算法8-排序
查看>>
windows缺少dll解决办法
查看>>
JPA多条件动态查询
查看>>
JPA自定义sql
查看>>
BigDecimal正确使用了吗?
查看>>
joplin笔记
查看>>
JNDI+springmvc使用
查看>>
vue+springboot分页交互
查看>>
vue+springboot打包发布
查看>>
XSL 开发总结
查看>>
【NOI 2018】归程(Kruskal重构树)
查看>>