快速业务通道

优化JDBC性能的三大技巧 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
执行,跟着会从数据库获取所有1000个键值。每一次对一行结果的请求都会使JDBC驱动直接从本地缓存中找到相应的键值, 然后构造一个包含了''WHERE ROWID=?''子句的最佳化查询, 再接着执行这个修改过的查询, 最后从服务器取得该数据行。

当程序无法像Scroll-Insensitive型光标一样提供足够缓存时, Scroll-Sensitive型光标可以被替代用来作为动态的可滚动的光标。

使用有效的getter方法

JDBC提供多种方法从ResultSet中取得数据, 像getInt(), getString(), 和getObject()等等。而getObject()方法是最泛化了的, 提供了最差的性能。 这是因为JDBC驱动必须对要取得的值的类型作额外的处理以映射为特定的对象. 所以就对特定的数据类型使用相应的方法。

要更进一步的改善性能, 应在取得数据时提供字段的索引号, 例如, getString(1), getLong(2), 和getInt(3)等来替代字段名。如果没有指定字段索引号, 网络交通不会受影响, 但会使转换和查找的成本增加. 例如, 假设你使用getString("foo") ... JDBC驱动可能会将字段名转为大写(如果需要), 并且在到字段名列表中逐个比较来找到"foo"字段。如果可以, 直接使用字段索引, 将为你节省大量的处理时间。

例如, 假设你有一个100行15列的ResultSet, 字段名不包含在其中. 你感兴趣的是三个字段 EMPLOYEENAME (字串型), EMPLOYEENUMBER (长整型), 和SALARY (整型). 如果你指定getString(“EmployeeName”), getLong(“EmployeeNumber”), 和getInt(“Salary”), 查询旱每个字段名必须被转换为metadata中相对应的大小写, 然后才进行查找. 如果你使用getString(1), getLong(2), 和getInt(15). 性能就会有显著改善。

获取自动生成的键值

有许多数据库提供了隐藏列为表中的每行记录分配一个唯一键值。很典型, 在查询中使用这些字段类型是取得记录值的最快的方式, 因为这些隐含列通常反应了数据在磁盘上的物理位置。在JDBC3.0之前, 应用程序只可在插入数据后通过立即执行一个SELECT语句来取得隐含列的值。

例如:

//插入行 int rowcount = stmt.executeUpdate ( "insert into LocalGeniusList (name) values (''Karen'')"); // 现在为新插入的行取得磁盘位置 - rowid ResultSet rs = stmt.executeQuery ( "select rowid from LocalGeniusList where name = ''Karen''");

这种取得隐含列的方式有两个主要缺点。第一, 取得隐含列是在一个独立的查询中, 它要透过网络送到服务器后再执行。第二, 因为不是主键, 查询条件可能不是表中的唯一性ID。在后面一个例子中, 可能返回了多个隐含列的值, 程序无法知道哪个是最后插入的行的值。

(译者:由于不同的数据库支持的程度不同,返回rowid的方式各有差异。在SQL Server中,返回最后插入的记录的id可以用这样的查询语句:SELECT @IDENTITY )

JDBC3.0规范中的一个可选特性提供了一种能力, 可以取得刚刚插入到表中的记录的自动生成的键值。

例如:

int rowcount = stmt.executeUpdate ( "insert into LocalGeniusList (name) values (''Karen'')", // 插入行并返回键值 Statement.RETURN_GENERATED_KEYS); ResultSet rs = stmt.getGeneratedKeys (); // 得到生成的键值

现在, 程序中包含了一个唯一性ID, 可以用来作为查询条件来快速的存取数据行, 甚至于表中没有主键的情况也可以。

这种取得自动生成的键值的方式给JDBC的开发者提供了灵活性, 并且使存取数据的性能得到提升.

选择合适的数据类型

接收和发送某些数据可能代价昂贵. 当你设计一个schema时, 应选择能被最有效地处理的数据类型. 例如, 整型数就比浮点数或实数处理起来要快一些。浮点数的定义是按照数据库的内部规定的格式,

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号