作者: 赵杨 笔名:bootcool    
  
[[email protected],[email protected]]   
  
美丽而温暖的昆明其实很适合做冷静的思考 
  
                               进一步提高JDBC应用程序的性能(二)  
  
  
  
二:在面向对象的程序设计和提升程序性能之间做出平衡  
  
当我们设计数据库应用程序的结构时,经常需要把对象模型映射成数据库中的表,或者把表反向映射成对象模型。面向对象的一个基本原则是:使得每一个对象与真实世界中的对应物具有共同的特征,以符合我们的思维习惯。 
  
 比如,数据库中有这样一张学生表: 
  
  
 
  
  
  
  
Id  | 
  
  
Name  |  
  
Department  | 
  
  
Position  | 
  
  
Address  |  
  
  
  
1  | 
  
  
张三  | 
  
  
物理系  | 
  
  
团员  | 
  
  
昆明  |  
 
  
  现在,我们需要把该表从数据库中映射给用户,基于上述原则,我们考虑封装一个类(在这我们暂时就称它为Record Set,当然具体到对学生表的映射,指的就是Student类),并且得出一个遵循面向对象设计原则的映射方案: 
  
  
  
  
  
(图3――方案1) 
  
我们知道,数据库应用程序的一个主要功能就是要把从数据库中查询到的结果,以某种形式再现给用户。为了符合用户的习惯,我们的程序使用了Java Swing 包中的JTable作为用户和程序之间交互的接口。我们现在唯一要做的就是确保程序映射数据的准确与快速. 
  
我们使用AbstractTableModel (关于AbstractTableModel 和 JTable的说明可以查看JDK1.3的Doc)作为映射数据的接口,当然也是用户与程序交互的核心。我们知道一个表格模型可以抽象为一个二维对象数组,或者二维Vector这样的数据结构。于是,我们有了另一个基于数据结构的映射方案: 
  
  
  
 
  
  
  
                               (图4――方案2) 
  
那究竟选择哪种方法呢?通过下表的比较,我们不难得出结论。 
  
  
 
  
  
  
  
映射方案  | 
  
  
面相对象  | 
  
  
封装性  | 
  
  
易理解性  | 
  
  
灵活性  | 
  
  
接口易实现性  | 
  
  
工作量小,性能好  |  
  
  
  
方案1  | 
  
  
ü            | 
  
  
ü            | 
  
  
ü            | 
  
  
   | 
  
  
   | 
  
  
   |  
  
  
  
方案2  | 
  
  
   | 
  
  
   | 
  
  
   | 
  
  
ü            | 
  
  
ü            | 
  
  
ü            |  
 
  
                                   (表 4) 
  
  
  
说明1:方案1表面上似乎遵循了面向对象的原则,但是: 
  
(1):其工作量显然比方案2大。 
  
(2):结果集因为类封装而失去了灵活性。 
  
(3):中间的各种转化会使程序的性能降低。 
  
说明2:但是方案1 在很多情况下都是最佳的选择。因为,当用户通过Web方式与程序交互时,实现对结果集的再封装就是必要的了。 
  
小结:在笔者的程序中,为了提高程序的性能,不得以放弃了面向对象的程序设计原则。而以JTable和AbstractTableModel API的本身特性反向得出了映射方案。有时依赖于API提供的方法,往往能提高程序的性能。当然这样的选择,主要取决于实际的要求和整个系统的结构设计,我们应该从不同的角度去考虑,最后才能做出平衡。 
  
  
  
                                                          赵杨:2002.3.31 
  
参考文章: 
  
http://java.sun.com/j2se/1.3/docs/guide/jdbc/getstart/GettingStartedTOC.fm.html  
 
  |