荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: georgehill (毕业生【一个人的精彩】), 信区: Java
标  题: [转载] Java访问数据库的速度瓶颈问题的分析及解决(补)(转寄)
发信站: 荔园晨风BBS站 (Thu Dec 13 13:32:28 2001), 站内信件

【 以下文字转载自 georgehill 的信箱 】
【 原文由 georgehill@smth.org 所发表 】
发信人: FoolsGarden (拼命※思想改造,重新做人), 信区: Java
标  题: Java访问数据库的速度瓶颈问题的分析及解决(补)
发信站: BBS 水木清华站 (Thu Dec 13 13:25:24 2001)

作为上面的《Java访问数据库的速度瓶颈问题的分析及解决》的后续补充,解除
原来的不能转载的约束,改为“严禁任何商业站点或其讨论区在没有授权的情况
下转载此文”,你可以在各个自由论坛之间转载,请注明作者信息和水木的连接
方式,以及上述严禁条款。任何违背自由精神的行为,将被追究法律责任。

软件模型中对数据库访问的设计模式的优化
在我阅读J2EE蓝图和JDO草案的过程中,我发现了访问模式对数据库访问的影响,因而想
在本文中阐述如何针对自己的软件需求选择合适的软件模式。
J2EE蓝图的设计者在Java Pet Store示例应用中使用了MVC(Model-View-Controller)
体系,给许多J2EE设计模式提供了背景。我要谈及的三种设计模式是:Data Access Ob
ject、Fast Lane Reader、Page-by-Page Iterator,它们为加快数据存取速度提供了一
些可以在系统设计阶段值得我们借鉴的想法。
Data Access Object
将商业逻辑从数据存取逻辑中分离出来,把存取的资源改编,从而使资源可以容易和独
立地转变。
依赖于底层数据资源的特殊要素(例如数据库的供应商)的商业组件,常将商业逻辑和
数据存取逻辑配合起来,只能使用特殊类型的资源,而使用不同类型的资源时,复用将
会非常困难,因此,只能服务于有限的市场领域。DAO(Data Access Object)即是将数
据存取逻辑从EJB中抽去出来抽象为一个独立的接口,EJB根据接口的操作执行商业逻辑
,而接口针对使用的数据资源实现为DAO对象。
在Java Pet Shop这个例子中,OrderEJB组件通过关联的OrderDAO类访问数据库,自身则
关注于商业逻辑的实现。在调度阶段,将配置某一类(OrderDAOCS、OrderDAOOracle或
OrderDAOSybase)为OrderDAO的实现,而OrderEJB无须任何更改。图3更能帮助你明白其
中的道理:
图3  Data Access Object的设计模式
此举增加了数据存取的弹性、资源的独立性和扩展性,但复杂度有相应的提高,其它附
带的问题我们不在这儿讨论。
Fast Lane Reader
抛弃EJB,加速只读数据的存取。
有些时候,高效地存取数据比获得最新的数据更重要。在Java Pet Store中,当一个用
户浏览商店的目录时,屏幕与数据库内容吻合不是至关紧要的,相反,迅速显示和重新
获得非常重要。FLR模式可以加速从资源中重新获得大型的列数据项的速度,它不用EJB
,而是更直接地通过DAO来存取数据,从而消除EJB的经常开支(例如远程方法调用、事
务管理和数据序列化等)。
在Java Pet Store这个例子中,当一个用户浏览目录时,通过CatalogDAO(而不是Cata
logEJB)从数据库加载数据项,而CatalogDAO是一个Fast Lane Reader的实例,使得读
访问变得迅速,如图4:
图4  Fast Lane Reader设计模式
与DAO模式不同的是,FLR是一个优化的模式,但不是要替代原有的访问机制,而是作为
补充使其完备。当你频繁地只读大型的列数据和不必存取最新的数据时,使用FLR将是非
常合适的。
Page-by-Page Iterator
为了高效地存取大型的远程数据列,一下子通过重新获得其元素为一个子列的Value Ob
ject(提高远程传输效率的设计模式,这儿不详尽描述)。
分布式数据库的应用经常需要用户考虑一长列数据项,例如一个目录或一个搜索结果的
集合。在这些情况下,立刻提供全列的数据经常不必要(用户并不是对所有的数据项感
兴趣)或不可能(没有足够的空间)。此外,当重新获得一列数据项时,使用Entity B
ean的代价将非常高昂,一个开销来自于使用远程探测器来收集Requested Bean,另外,
更大的开销来自对每个Bean产生远程调用以从用户获得数据。
通过Iterator,客户机对象能一下子重新获得一个子列或者页的Value Object,每一页
都刚好满足客户机的需求,因此,程序使用较少的资源满足了客户机的立刻需求。
在Java Pet Store这个例子中,JSP页面product.jsp任何时候只显示一个数据列的一部
分,从ProductItemListTag(Page-by-Page Iterator)重新获得数据项,当客户机希望
看到列中的别的数据项,product.jsp再次调用Iterator重新获得这些数据项,流程见图
5:
图5  Page-by-Page Iterator设计模式
以上设计模式的应用向我们表明,在某些特殊情况下,优化对数据库的访问模型,既可
满足用户的需求又可提高访问数据库的效率。这给我们一个思路,就是:在你的硬件环
境可能会产生瓶颈的情况下,可以通过对软件模型的优化来达到满足需求的目的。上述
三种设计模式的应用情形为:
Data Access Object 需要将商业逻辑和数据存取逻辑分离;在调度的时刻,需要支持选
择数据源的类型;使用的数据源的类型的变化,对商业对象或其它客户端完成数据存取
没有影响。
Fast Lane Reader 面对大型的列数据,需要经常的只读访问;访问最新的数据并不是至
关紧要的事情。
Page-by-Page Iterator 存取大型的服务器端数据列;任何时刻,用户只对列的一部分
内容感兴趣;整个列的数据不适合在客户端显示;整个列的数据不适合在存储器中保存
;传输整个列的数据将耗费太多的时间。
在显示商品目录的时候,我们选择了DAO和FLR的结合,因为它们两者的条件都得到了满
足(需要分离商业逻辑和数据存取逻辑,经常的只读访问和对即时性不敏感),此时应
用将会大大发挥它们的优点。而在进行内容检索的时候,我们会选择PPI,因为也许检索
出了上千条的记录,但是用户没有兴趣立即阅读全部内容,而是一次十条地阅读,或者
他在阅读完前十条记录后发觉自己的目的已经达到,接下来浏览别的网页了,都不必我
们一次性地传输上千条记录给他,所以也是PPI的应用条件得到了满足,结果则是此模式
的优点得到了发挥,又不影响全局的数据访问。
在进行软件模型的设计时,整体的框架可以应用某些优秀的、通用的设计模式,这样既
加快模型的建立速度,又能和其它系统集成。但是,碰到一些瓶颈问题的情况下,我们
就需要对局部的设计模式做一些调整,以优化整个系统,上述三个模式就是对原有体系
的补充,它们并没有对整体的框架做出巨大的改变,却突破了某些瓶颈(瓶颈往往是局
部的)障碍,让我们的产品更好地服务于用户。
将深入研究的问题
开篇至今,我们主要探讨了软件层次上的解决问题,但是,必须肯定一点,如果你的硬
件环境非常差(运行Java都有困难)或非常好(额外的存储空间、超快的运算速度和富
裕的网络带宽),上述途径对你来说很难有大的帮助。前一种情况,我建议你升级硬件
设备到软件厂商推荐的配置(强烈反对最小配置),以使应用服务器、数据库、Java等
软件能够运行自如;后一种情况,我没什么话可说,花钱是解决这个问题最好的办法。

本文并未谈及线程池和缓冲区这两个非常重要的概念,因为笔者认为,它们是针对局部
时间高访问量的瓶颈问题的解决,不能理解为简单的速度瓶颈问题,所以我会在下一篇
文章中分析这种特殊的情况和提出解决问题的办法。也许你对这一点更关心一些,认为
自己的问题就出在这个地方,这是非常好的思考问题的方式,你已经抓住了问题的关键
。但是,我还是建议你通读一下本文,让自己对速度瓶颈问题有更好的理解,并掌握在
解决问题的过程中,分辨常态和暂态,从而选择不同的思路入手。其实,本文谈及的就
是速度瓶颈问题的常态,而下一篇文章讨论的将会是暂态,希望你能够渐入佳境。
JDO(Java Data Object)是需要我们关注的一个API,它定义了新的数据存取模型,直
接借鉴了DAO设计模式。不同的数据源,有不同的数据存取技术,就有不同的API供开发
人员使用。JDO正是为了解决这个问题而产生的,它实现了即插即用的数据存取的实现和
持久信息(包括企业数据和本地存储的数据)以Java为中心的视图。因此,开发人员只
关注创建那些实现商业逻辑的类和用它们来表现数据源的数据,而这些类和数据源之间
的映射则由那些EIS领域的专家来完成。如果大家对JDO感兴趣的话,那么我会写第三篇
文章把其详细介绍给大家,并给出示例应用。
参考资料
1 BBS水木清华站(telnet://smth.org)
2 JDBC的官方网站(http://java.sun.com/products/jdbc/index.html)
3 DataDirect的JDBC驱动(http://www.datadirect-technologies.com/jdbc/jdbc.asp

4 J2EE的设计模式(http://java.sun.com/blueprints/patterns/j2ee_patterns/inde
x.html)
5 Java指南第二版(http://java.sun.com/docs/books/tutorial/index.html)

--
对等网络真的会来临么?嘿嘿,那些分布式的承诺怎么办?等着我们去探讨唄。
Jxta--跨平台、跨操作系统、跨编程语言的开放式P2P应用。


※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.77.2]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.1.238]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店