您的位置:首页 >> 编程开发 >> Java >> 数据库 >> 正文
数据库 RSS
 

JDBC性能技巧(3)

http://www.rdxx.com 02年04月12日 11:23 互联网 我要投稿

关键词: JDBC , 性能 , 技巧 , JDB

JDBC性能技巧

翻译:陈先波(turbochen@163.com)

日期:2004/6/10

阅读原文:http://www.theserverside.com/articles/article.tss?l=JDBCPerformance_PartIII

Performance Tips for the Data Tier (JDBC) - Part I: Using Database MetaData methods appropriately

April 2004

Part I - 正确的使用数据库MetaData方法

Part II - 获取需要的数据

Part III - 选用最佳性能的功能

介绍

John Goodson 是一名JDBC专家组成员,也是DataDirect Technologies公司的副总裁.

开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你.

本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括:

  • 正确的使用数据库MetaData方法
  • 只获取需要的数据
  • 选用最佳性能的功能
  • 管理连接和更新

以下这些一般性原则可以帮助你解决一些公共的JDBC系统的性能问题.

选用JDBC对象和方法

本节的指导原则将帮助你在选用JDBC的对象和方法时哪些会有最好的性能.

在存储过程中使用参数标记作为参数

当调用存储过程时, 应总是使用参数标记(?)来代替字面上的参数. JDBC驱动能调用数据库的存储过程, 也能被其它的SQL查询执行, 或者直接通过远程进程调用(RPC)的方式执行. 当你将存储过程作为一个SQL查询执行时, 数据库要解析这个查询语句, 校验参数并将参数转换为正确的数据类型.

要记住, SQL语句总是以字符串的形式送到数据库, 例如, “{call getCustName (12345)}”. 在这里, 即使程序中将参数作为整数赋给了getSustName, 而实现上参数还是以字符串的形式传给了服务器. 数据库会解析这个SQL查询, 并且根据metadata来决定存储过程的参数类型, 然后分解出参数"12345", 然后在最终将存储过程作为一个SQL查询执行之前将字串'12345’转换为整型数.

按RPC方式调用时, 之前那种SQL字符串的方式要避免使用. 取而代之, JDBC驱动会构造一个网络packet, 其中包含了本地数据类型的参数,然后执行远程调用.

案例 1

在这个例子中, 存储过程不能最佳的使用RPC. 数据库必须将这作为一个普通的语言来进行解析,校验参数类型并将参数转换为正确的数据类型,最后才执行这个存储过程.

CallableStatement cstmt = conn.prepareCall (
   "{call getCustName (12345)}");
ResultSet rs = cstmt.executeQuery ();

案例 2

在这个例子中, 存储过程能最佳的执行RPC. 因为程序避免了字面的的参数, 使用特殊的参数来调用存储过程, JDBC驱动能最好以RPC方式直接来执行存储过程. SQL语言上的处理在这里被避免并且执行也得到很大的改善.

CallableStatement cstmt - conn.prepareCall (
   "{call getCustName (?)}");
cstmt.setLong (1,12345);
ResultSet rs = cstmt.executeQuery();

使用Statement而不是PreparedStatement对象

JDBC驱动的最佳化是基于使用的是什么功能. 选择PreparedStatement还是Statement取决于你要怎么使用它们. 对于只执行一次的SQL语句选择Statement是最好的. 相反, 如果SQL语句被多次执行选用PreparedStatement是最好的.

PreparedStatement的第一次执行消耗是很高的. 它的性能体现在后面的重复执行. 例如, 假设我使用Employee ID, 使用prepared的方式来执行一个针对Employee表的查询. JDBC驱动会发送一个网络请求到数据解析和优化这个查询. 而执行时会产生另一个网络请求. 在JDBC驱动中,减少网络通讯是最终的目的. 如果我的程序在运行期间只需要一次请求, 那么就使用Statement. 对于Statement, 同一个查询只会产生一次网络到数据库的通讯.

对于使用PreparedStatement池的情况下, 本指导原则有点复杂. 当使用PreparedStatement池时, 如果一个查询很特殊, 并且不太会再次执行到, 那么可以使用Statement. 如果一个查询很少会被执行,但连接池中的Statement池可能被再次执行, 那么请使用PreparedStatement. 在不是Statement池的同样情况下, 请使用Statement.

共4页  第1页 第2页 第3页 第4页


 
 
标签: JDBC , 性能 , 技巧 , JDB 打印本文
 
 
  相关资讯
RSS
 
 
 
  热点搜索
 
 
 



Valid XHTML 1.0 Transitional
Copyright ©2005 - 2008 Rdxx.Com,All Rights Reserved
收藏本页
收藏本站