CSDN博客

img oneGeng

1.2.5 对象导航

发表于2008/9/28 19:04:00  366人阅读

    在Java中访问对象和在数据库中访问对象是不同的。在java中,如果你要访问User的Billing信息,你可以调用aUser.getBillingDetails().getAccountNumber()方法。这是面向对象中最通常的访问对象的方法,这种访问对象的方式被称之为行走对象图。你通过导航从一个对象到达另一个对象,但是这种方式在面向对象的数据库中运行的并不尽如人意。
    提高数据库性能的唯一办法就是最小化访问数据库的连接数。所以最明显的方法就是减少对数据库的SQL查询(其他方法包括使用存储过程和JDBC batch)。
    因此提高效率的方式就是把表连接起来,而连接中表的个数往往决定了对象导航的深度。举例来说,如果你仅仅对于User感兴趣而对于他的BillingDetails没有兴趣,那么就可以使用简单查询,
        select * from user u where u.USER_ID=123
    从另一方面说,如果同时还要访问User的UserBillingDetails信息的话,我们就要使用一个不同的查询,
        select * from user u left outter join billing_details bd on bd.USER_ID=u.USER_ID where USER_ID=123
    正如我们看到的,当我们进行对象导航的时候,我们需要清楚的知道我们要访问的对象在图中的位置。
    从另一方面说,任何对象持久化方案都提供了同一种功能,那就是只有在初次访问对象的时候才会取得相关对象的数据。但是,这种方式对于关系型数据库来说却显得效率不高,因为这意味着它要对于对象图中的每一个节点都要执行一次Statement,这也造成N+1次的查询。
    这种在Java和关系型数据库中的差异,也许是造成性能不匹配的最主要根源。虽然在许多报刊杂志中都建议使用StringBuffer来建立字符串的连接,但是这并不能解决N+1次查询的问题。幸运的是,Hibernate提供了关于这个问题的成熟的解决方法。我们将在第4章和第7章来讨论这些内容。
    现在我们已经有了一个详尽的面向对象和关系数据库的不匹配的列表,这其中也包括具体项目的耗费和解决方案,当然你也许已经根据自己的经验能够解决这些问题。这种耗费往往是无法准确估计的,我想这也是许多失败项目的重要原因吧。
     
阅读全文
0 0

相关文章推荐

img
取 消
img