博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2011-07-06 11:19 Hibernate提供了3种检索策略
阅读量:5052 次
发布时间:2019-06-12

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

Hibernate提供以下检索策略:
==> 立即检索
==> 延迟检索
==> 迫切左外连接检索
 
 
总结一下优缺点和优先考虑使用的场合
1、立即检索:
优点:
对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便地从一个对象导航到与它关联的对象。
缺点:
[1]select语句数目多
[2]可能会加载应用程序不需要访问的对象,浪费时间和内存空间
优先考虑使用的场合:
[1]类级别
[2]应用程序需要立即访问的对象
[3]使用了二级缓存
 
2、延迟检索:
优点:
由应用程序决定需要加载哪些对象,可以避免执行多余的select语句,以及避免加载应用程序不需要访问的对象。因此能提高检索性能,并且节省内存空间
缺点:
应用程序如果需要访问游离状态的代理类实例,必须保证它在持久化状态时已经被初始化。
优先考虑使用的场合:
[1]一对多或者多对多关联
[2]应用程序不需要立即访问或者根本不访问的对象
 
3、迫切左外连接检索:
优点:
[1]对应用程序完全透明,不管对象处于之久化状态还是游离状态,应用程序都可以方便的从一个对象导航到另一个与它关联的对象。
[2]使用了外连接,select语句数目少
缺点:
[1]可能会加载应用程序不需要访问的对象,浪费内存空间
[2]复杂的数据表连接会影响检索性能
优先考虑使用的场合:
[1]多对一或者一对一关联
[2]应用程序需要立即访问的对象
[3]数据库系统具有良好的表连接性能
 
简单总结一下
    对于立即检索和延迟检索策略,在查询每张表时使用单独的select语句,每个select语句都很简单,查询速度快,但是select数目过多,增加了DB访问频率。
    对于迫切左外连接检索策略,运用了SQL外连接的查询功能,select语句数量少,可减少DB访问频率,但是每个select语句的复杂度增加了,DB系统建立表之间的连接也是耗时的操作,所以查询效率会有所下降。
    对于关联级别的立即检索和延迟检索,可以设置批量检索数量,以减少select语句数量,从而改善性能。<class>和<set>的batch-size属性的合理取值应该在3-10之间。
    对于实际应用,为了选择合适的检索策略,需要测试应用程序的各个用例,跟踪使用不同检索策略的Hibernate执行SQL的语句。可以把Hibernate.properties文件中的show_sql属性设为true,使得hibernate在运行时输出执行的SQL语句。根据特定的关系模型,评估各种查询语句的性能,比较到底是使用外连接查询速度快,还是使用分开的select语句查询速度快。
select * from CUSTOMERS left outer join ORDERS on CUSTOMERS.ID=ORDERS.CUSTOMER_ID where CUSTOMERS.ID=1;
select * from CUSTOMERS where ID=1;
select * from ORDERS where CUSTOMER_ID=1;
不断的调节检索策略,以便在减少select语句数量和降低select语句复杂度之间找到一个平衡点,获取最佳的检索性能。
 
具体MappingXML中的配置
了解了各自的优缺点,该到动手配置的时候了。以下几个属性用来控制检索策略:
lazy:可选值为true和false,在<class>和<set>中有此属性,默认值为false,如果为true表示延迟检索。
outer-join:可选值为auto,true和false,在<many-to-one>,<one-to-one>和<set>中有此属性,其中在<many-to-one>和<one-to-one>中默认值为auto,在<set>中默认值为false。如果为true表示使用迫切左外连接策略。
batch-size:在<class>和<set>中有此属性,默认值为1,设定批量检索的数量。如果设定此项,合理的取值在3~10之间的整数。仅适用于关联级的立即检索和延迟检索。
 
 

转载于:https://www.cnblogs.com/aaa6818162/archive/2013/04/26/3044759.html

你可能感兴趣的文章
Android TextView加上阴影效果
查看>>
Android 音量调节
查看>>
windows上面链接使用linux上面的docker daemon
查看>>
每天一个小程序—0005题(批量处理图片大小)
查看>>
js-创建对象的几种方式
查看>>
JDK JRE Java虚拟机的关系
查看>>
[算法之美] KMP算法的直观理解
查看>>
EntityFramework 性能优化
查看>>
【ASP.NET开发】菜鸟时期的ADO.NET使用笔记
查看>>
android圆角View实现及不同版本号这间的兼容
查看>>
OA项目设计的能力③
查看>>
Cocos2d-x3.0 文件处理
查看>>
全面整理的C++面试题
查看>>
Activity和Fragment生命周期对比
查看>>
查找 EXC_BAD_ACCESS 问题根源的方法
查看>>
日常报错
查看>>
list-style-type -- 定义列表样式
查看>>
Ubuntu 编译出现 ISO C++ 2011 不支持的解决办法
查看>>
Linux 常用命令——cat, tac, nl, more, less, head, tail, od
查看>>
VueJS ElementUI el-table 的 formatter 和 scope template 不能同时存在
查看>>