J2EE应用中,提升数据访问层的性能 |
作者:佚名 发布时间:2005-04-02 来源:不详
|
本文从以下四个部分加以说明:
由于元数据方法执行速 果集需要大量的开销,由元 可以提供JDBC的性能。例如 ,共应用再次使用。
|
度比较慢,故要尽量少用元数据 数据方法产生的结果集应该缓存 在应用中你调用了getTypeInfo
|
方法。由于调用元数据方法产生结 起来,而不是多次执行查询,这样 一次,你就应该将结果集缓存起来
|
给元数据提供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驱动处
|
给元数据方法提供的信息越多,你得到的信息的准确性和性能也越高。 |
避免使用getColumns()确定一个表的 许用户选择列的应用。应用应该用getCol 用getMetadata()呢?
|
特征。用getMedata()哑元查询替换之。考虑一个容 umns()返回用户列的信息还是准备一个哑元查询并调
|
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
|
// 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()
|
除非必要,由于检索长 长数据,如果用户需要看这
|
数据会造成网络资源紧张而降低 些数据,应用再去检索。
|
性能。通常大多数用户不需要看到
|
我们的代码中长出现这样的代码:select * from <table name> …如果选择的表中有长数据列,那这个查询的性能将会非常糟糕。再说,表中的所有数据项你都需要吗?如果不需要,为什么要让它们在网络上传递,浪费网络资源? |
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()支持这种长数据字 数据的时候再去读它。
|
段的检索,但并不是每个数据库都
|
有时候,长数据必须被 更多)的正文。 为了减少网 setMaxFieldSize(),以及 理的范围之内。另一个减少 尺寸,使用最小的包尺寸将
|
检索。在这种情况下,大多数用 络流量和提高性能,你可以通过 与驱动相关的setFetchSize()方 检索到的数据大小的方法是减少 会满足你的需要。
|
户可能不需要在屏幕看到100k(或 调用setMaxRows(), 法把检索到的数据大小减少到可管 列的数量。如果驱动允许你定义包
|
记住:注意只返回你需要的行和列。 特别是不需要的结果中包含了长数据。
|
如果你返回了五列而你只需要两列,性能就降低了??
|
检索和送出某种数据的 的数据类型。例如,整型要 常是压缩格式。为了能被数
|
类型的开销是很昂贵的。当设计 比浮点数和小数数据要快。浮点 据库通讯协议处理,这些数据必
|
数据库模式时,选择能最有效处理 数根据数据库特殊的格式定义,通 须被解压后再转换成不同的格式。
|
由于数据库系统对滚动游标的有限支 数据库支持滚动记录集(例如,rs),否则 少行。对模仿滚动游标的JDBC驱动而言, 络检索所有的数据。可以替代的方法是你 SELECT语句中一个带有COUNT列的查询得
|
持,大多数JDBC驱动不能实现滚动游标。除非你确定 不要调用rs.last()和rs.getRow()去得到记录集有多 调用rs.last()会导致驱动为了到最后一行而通过网 可以通过记录集枚举记录行数,或者通过提交在 到行数。
|
|
|
|
|
|