帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统
栏 目:
 
您的位置:首页 > 技术文档 > JAVA编程
J2EE应用中,提升数据访问层的性能
作者:佚名 发布时间:2005-04-02 来源:不详
  本文从以下四个部分加以说明:                                                  
  适当地使用数据库的元数据方法                                                  
  检索需要的数据                                                                
  选择优化性能的功能                                                            
  管理连接和数据更新                                                            
  适当地使用数据库的元数据方法                                                  
  1.1.  尽量少用元数据方法                                                
  由于元数据方法执行速
果集需要大量的开销,由元
可以提供JDBC的性能。例如
,共应用再次使用。
度比较慢,故要尽量少用元数据
数据方法产生的结果集应该缓存
在应用中你调用了getTypeInfo

方法。由于调用元数据方法产生结
起来,而不是多次执行查询,这样
一次,你就应该将结果集缓存起来

  1.2.  避免查询模式                                                      
  给元数据提供null参数
过网络传递,导致网络流量
尽可能地给它提供非null参
或查询模式将会产生耗时的查询
的增大,降低整个系统的性能。
数和高效地调用它。而我们的应
。同时,由于一些不需要的数据通
由于元数据方法执行比较慢,所以
用常出现这样的现象:
  ResultSet WSrs = WSc
.getTables (null, null, "WST
able", null);
  应该改成:                                                                    
  ResultSet WSrs = WSc.getTables (
"cat1", "johng", "WSTable", "TABLE");
  显然,在第一个getTables()调用中
JDBC驱动按字面上的调用与解析请求不同
WSTable”的表,视图,系统表,同义词
的别名。
,应用可能需要知道WSTable表是否存在。当然,
。JDBC是这样解析请求的:返回所有的名称叫“
,零时表,或在任何数据库目录中数据库的模式存在

  第二个getTables()的
返回所有名叫“WSTable”
理第二个请求要比处理第一
调用更准确地反映了应用需要知
存在与当前目录中模式为“john
个请求来得更有效。
道什么。JDBC这样解析这个请求:
g’的所有表。显然,JDBC驱动处

  给元数据方法提供的信息越多,你得到的信息的准确性和性能也越高。                
  1.3.  使用哑元查询来确定表的特征                                        
  避免使用getColumns()确定一个表的
许用户选择列的应用。应用应该用getCol
用getMetadata()呢?
特征。用getMedata()哑元查询替换之。考虑一个容
umns()返回用户列的信息还是准备一个哑元查询并调

  情形1:getColumns方法                                              
  ResultSet WSrc = WSc
getColumns() will genera
which must be prepared,
c.next();string Cname =
server// N = # result co
been obtained
.getColumns (... "UnknownTab
te a query to// the system c
executed, and produce// a re
getString(4);. . .// user mu
lumns of UnknownTable// resu

le" ...);// This call to
atalogs... possibly a join//
sult set. . .WSr
st retrieve N rows from the
lt column information has now

  情形2:getMetadata方法                                            
  // prepare dummy que
* from UnknownTable WHER
preparedResultSetMetaDat
smd.getColumnCount();...
information has now been
ryPreparedStatement WSps = W
E 1 = 0");// query is never
a WSsmd=WSps.getMetaData();i
int ctype = WSrsmd.getColumn
obtained
Sc.prepareStatement ("SELECT
executed on the server - only
nt numcols = WSr
Type(n)...// result column

  在两个情形中,查询被
信息必须被简洁地表达,并
并且仅有结果描述信息被简
送到服务器上。但在情形1中,
且结果集必须送到客户端。在情
洁地描述。显然,情形2是更好
查询必须被准备和执行,结果描述
形2中,一个简单的查询必须准备
的性能模式。
  这多少有些把这个讨论复杂化了,让
形1的性能没有变,但由于哑元查询必须
增加。因为查询语句的Where子句计算结
数据的执行。在这个情形下,方法2仍然
我们考虑一个不支持本地准备SQL语句的数据库。情
被求值而不是仅仅准备,因此情形2的性能稍微有些
果总是FALSE,因此查询没有产出结果行和不存取表
要比方法1做的好。
  总之,总是使用结果集元数据检索表
当被请求的信息不能从结果记录集(例如
方法。
列信息,如列名,列数据类型和列精度和数值范围。
,表列默认值)获取的时候,仅仅使用getColumns()

  2.  检索需要的数据                                                        
  2.1.  检索长数据                                                        
  除非必要,由于检索长
长数据,如果用户需要看这
数据会造成网络资源紧张而降低
些数据,应用再去检索。
性能。通常大多数用户不需要看到

  我们的代码中长出现这样的代码:select * from <table name> …如果选择的表中有长数据列,那这个查询的性能将会非常糟糕。再说,表中的所有数据项你都需要吗?如果不需要,为什么要让它们在网络上传递,浪费网络资源?

  例如,看看下边的JDBC代码:                                                
  ResultSet rs = stmt.
'999-99-2222'");rs.next(
executeQuery (  "select * f
);string name = rs.getString
rom Employees where SSID =
(4);
  JDBC不是智能的。当你这样写代码的
的都返回当然是情理之中的事情了,所以
如果Employees表中有照片之类的长数据
时候,它根本就不知道你真正需要那些列,它把所有
开发的时候就劳烦把需要的列在Select语句中指明。
字段,系统的性能之低就可想而知了。
  尽管有方法getClob()
支持它。所以记住:需要长
和getBlod()支持这种长数据字
数据的时候再去读它。
段的检索,但并不是每个数据库都

  2.2.  减少检索到的数据的大小                                            
  有时候,长数据必须被
更多)的正文。 为了减少网
setMaxFieldSize(),以及
理的范围之内。另一个减少
尺寸,使用最小的包尺寸将
检索。在这种情况下,大多数用
络流量和提高性能,你可以通过
与驱动相关的setFetchSize()方
检索到的数据大小的方法是减少
会满足你的需要。
户可能不需要在屏幕看到100k(或
调用setMaxRows(),
法把检索到的数据大小减少到可管
列的数量。如果驱动允许你定义包

  记住:注意只返回你需要的行和列。
特别是不需要的结果中包含了长数据。
如果你返回了五列而你只需要两列,性能就降低了??

  2.3.  选择正确的数据类型                                                
  检索和送出某种数据的
的数据类型。例如,整型要
常是压缩格式。为了能被数
类型的开销是很昂贵的。当设计
比浮点数和小数数据要快。浮点
据库通讯协议处理,这些数据必
数据库模式时,选择能最有效处理
数根据数据库特殊的格式定义,通
须被解压后再转换成不同的格式。
  2.4.  检索记录集                                                        
  由于数据库系统对滚动游标的有限支
数据库支持滚动记录集(例如,rs),否则
少行。对模仿滚动游标的JDBC驱动而言,
络检索所有的数据。可以替代的方法是你
SELECT语句中一个带有COUNT列的查询得
持,大多数JDBC驱动不能实现滚动游标。除非你确定
不要调用rs.last()和rs.getRow()去得到记录集有多
调用rs.last()会导致驱动为了到最后一行而通过网
可以通过记录集枚举记录行数,或者通过提交在
到行数。
 
 
  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·在J2EE组件中引用和查找Web服务  (2005-04-02)
 ·Mercury推出增强J2EE软件性能组件  (2005-04-02)
 ·J2EE的Web和企业架构(WEA)设计  (2005-04-02)
 ·实战 J2EE 开发购物网站 创建数据  (2005-04-02)
 ·用Flash远程调用增强J2EE表示层  (2005-04-02)
 ·Struts开发指南之J2EE n层结构  (2005-04-02)
 ·Java 理论与实践:让 J2EE 脱离容  (2005-04-02)
 ·J2EE 探险者:持久数据管理  (2005-04-02)
 ·如何正确利用 J2EE 的各种工具  (2005-04-02)
 ·如何使用 J2EE 连接器架构实现企  (2005-04-02)

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·DiscuzX2.5会员整合通行证发布
·帝国CMS 7.0版本功能建议收集
·帝国网站管理系统2012年授权购买说
·PHPWind8.7会员整合通行证发布
·[官方插件]帝国CMS-访问统计插件
·[官方插件]帝国CMS-sitemap插件
·[官方插件]帝国CMS内容页评论AJAX分
   类别最新
·谈谈JDBC
·JDBC专题介绍
·JDBC接口技术
·利用weblogic的POOL(连接池)连接
·Jsp中调用Oracle存储过程的小例子
·JSP数据库操作例程
·JSP数据库连接大全
·用连接池提高Servlet访问数据库的效
·一种简单JDBC连接池的实现
·数据库连接池Java实现小结
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统