4.4.5 取得策略
来源:互联网 发布:python交互编程入门 编辑:程序博客网 时间:2024/05/18 15:52
在传统的关系数据库访问中,你可以通过一条SQL语句,利用内连接和外连接来取得所需要的数据。对于一些原始的ORM实现策略来说,访问对象图的持久化对象需要对数据库进行许多琐碎的请求才行。这种方式没有充分的利用关系数据库连接的能力。实际使用中,这种策略的性能很差。ORM中需要处理的最难的问题,就是如何有效的访问关系型数据。
鉴于我们处理过的多个应用来说,通过对数据库频繁访问的方式来取得数据库是不可接受的。因此,我们建议工具应该把关注重点更多的集中的关系数据库上的R。
有效的访问对象图的问题通常在元数据的关联映射中得到体现。这个方法的问题就是每个代码片段都需要使用一组不同的关联对象。但是这并不足够。我们建议的是在运行时对于细粒度的关联取得的支持。Hibernate支持以上不同的策略,默认情况下以及在运行时动态的修改。
对于关联关系,Hibernate允许你选择四种不同的取得策略:
1)立即取得:通过顺序的读取数据库(或者缓存)里去的关联对象。
2)延迟加载:当第一次访问的时候,才加载对象。这会导致对数据库的访问。
3)Eagar取得:关联对象或者集合和拥有它的对象同时取得,这种放是使用的SQL的外连接,取得之后,不会对数据库进行再次访问。
4)批量加载:用来改善延迟加载的性能,它通过批量加载对象或者集合来达到这个目的。
让我们仔细的看每个策略。
立即加载
当从数据库获得一个实体的时候,立即从数据库或者缓存获得其他相关的实体。通常情况下,立即加载的方式的效率并不高,除非关联的数据已经在缓存中存在。
延迟加载
当客户端请求一个实体以及其关联的对象的时候,通常并不需要加载对象图中的所有对象。你肯定不希望以此把所有对象都放入内存。
延迟加载允许你决定在第一次访问数据库的时候加载多少对象。延迟加载是对象持久化的一个基础概念,同时它也是改善性能的第一步。
我们建议所有的关联都应该配置成延迟加载的。当在运行时,可以动态的修改这种策略。
Eager加载
延迟加载能够帮助减少数据加载,它通常是一种默认的策略。然而,看起来这种性能的优化策略更像是瞎猜。
Eager加载允许你显式的制定那些关联对象需要在一起加载。Hibernate可以利用外连接来实现这种功能。性能优化也通常需要判断在Hibernate中合适使用这种加载策略。因此,尽管可以在配置中设置这种加载策略,但是更常见的是在运行时去修改。
批量加载
严格上说,批量加载并不算是一种加载策略;它是一种改善延迟加载性能的技术。通常情况下,当你加载一个对象或者集合的时候,你的SQL WHERE中指定对象的标识符。如果批量加载被指定的话,Hibernate就会通过查找代理或者集合,从而在WHERE中指定多个标识符来实现批量加载。
我们并不是这种做法的拥护者;eager加载通常要更快一些。批量加载通常使用那些经验比较少的开发者,这样做可以降低SQL的复杂性。
现在让我们来元数据中为一些关联关系配置加载策略。
- 4.4.5 取得策略
- 恭喜取得5颗绿星!
- 4.4.1 通过标识符取得对象
- 4.4分支管理策略
- 策略模式(Strategy) 5
- 5-策略模式
- 策略
- 策略
- 策略
- HTML 5取得用户的精度和纬度
- 关于 iOS 5 里无法取得 UUID 的一个解决方案
- Lua学习笔记(5) : 取得table內变量
- 取得环境变量
- 取得IP
- 取得存儲過程參數個數
- 取得資料表欄位說明
- 取得手机型号
- 取得innerText
- linux下模拟键盘的几种方法
- as3 中 定点表示法 和 浮点表示法
- 搜索文件夹内的所有文件里包含某字符串的linux命令
- “新36条”对“三网融合”的启示
- .NET面试题及答案1
- 4.4.5 取得策略
- 人民币大写格式转换
- 关于final的基本知识运用02
- 从Word工具栏中启动应用程序
- 原来的控件delphi7里何处寻?
- 失望
- 痛苦并快乐着
- C++和C#编写并且相互调用COM组件
- CDialog响应键盘事件