4.4.5 取得策略

来源:互联网 发布:python交互编程入门 编辑:程序博客网 时间:2024/05/18 15:52

在传统的关系数据库访问中,你可以通过一条SQL语句,利用内连接和外连接来取得所需要的数据。对于一些原始的ORM实现策略来说,访问对象图的持久化对象需要对数据库进行许多琐碎的请求才行。这种方式没有充分的利用关系数据库连接的能力。实际使用中,这种策略的性能很差。ORM中需要处理的最难的问题,就是如何有效的访问关系型数据。

鉴于我们处理过的多个应用来说,通过对数据库频繁访问的方式来取得数据库是不可接受的。因此,我们建议工具应该把关注重点更多的集中的关系数据库上的R

有效的访问对象图的问题通常在元数据的关联映射中得到体现。这个方法的问题就是每个代码片段都需要使用一组不同的关联对象。但是这并不足够。我们建议的是在运行时对于细粒度的关联取得的支持。Hibernate支持以上不同的策略,默认情况下以及在运行时动态的修改。

对于关联关系,Hibernate允许你选择四种不同的取得策略:

1)立即取得:通过顺序的读取数据库(或者缓存)里去的关联对象。

2)延迟加载:当第一次访问的时候,才加载对象。这会导致对数据库的访问。

3Eagar取得:关联对象或者集合和拥有它的对象同时取得,这种放是使用的SQL的外连接,取得之后,不会对数据库进行再次访问。

4)批量加载:用来改善延迟加载的性能,它通过批量加载对象或者集合来达到这个目的。

让我们仔细的看每个策略。

立即加载

当从数据库获得一个实体的时候,立即从数据库或者缓存获得其他相关的实体。通常情况下,立即加载的方式的效率并不高,除非关联的数据已经在缓存中存在。

延迟加载

当客户端请求一个实体以及其关联的对象的时候,通常并不需要加载对象图中的所有对象。你肯定不希望以此把所有对象都放入内存。

延迟加载允许你决定在第一次访问数据库的时候加载多少对象。延迟加载是对象持久化的一个基础概念,同时它也是改善性能的第一步。

我们建议所有的关联都应该配置成延迟加载的。当在运行时,可以动态的修改这种策略。

Eager加载

延迟加载能够帮助减少数据加载,它通常是一种默认的策略。然而,看起来这种性能的优化策略更像是瞎猜。

Eager加载允许你显式的制定那些关联对象需要在一起加载。Hibernate可以利用外连接来实现这种功能。性能优化也通常需要判断在Hibernate中合适使用这种加载策略。因此,尽管可以在配置中设置这种加载策略,但是更常见的是在运行时去修改。

批量加载

严格上说,批量加载并不算是一种加载策略;它是一种改善延迟加载性能的技术。通常情况下,当你加载一个对象或者集合的时候,你的SQL WHERE中指定对象的标识符。如果批量加载被指定的话,Hibernate就会通过查找代理或者集合,从而在WHERE中指定多个标识符来实现批量加载。

我们并不是这种做法的拥护者;eager加载通常要更快一些。批量加载通常使用那些经验比较少的开发者,这样做可以降低SQL的复杂性。

现在让我们来元数据中为一些关联关系配置加载策略。