动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.充分利用链接异常处理.
.Java传说之风云再起.
.J2EE宠物商店 (1).
.Second-generation aspect-orien.
.使用Doxygen构建文档系统.
.j2ee性能调优之最小化资源压力测.
.Ubuntu上利用subclipse访问SVN.
.定义函数数组,跟一个外国哥们学来.
.java应用 tomcat中实现https安全.
.关于JCreator Pro 3.0的一个折中.
..Net下调用SQL Server2000中存储.
.java事件的小总结.
.Shark api 应用:判断流程进行到.
.JBoss的安装.
.JAVA编程规范(1).
.JDK的命令详解(2).
.心得:Spring 3种注入的比较分析.
.面向服务架构(SOA)推荐方法(组.
.JBOSS4数据源配置大全(一).
.EJB 最佳实践:工业强度的 JNDI .

如何测定JDBC的性能(下)

发表日期:2008-1-5 |



  封装ResultSet类
  ResultSetWrapper类也主要包括托付方法:
  public class ResultSetWrapper implements ResultSet
  {
  ResultSet realResultSet;
  StatementWrapper parentStatement;
  String sql;
  public ResultSetWrapper(ResultSet resultSet, StatementWrapper statement, String sql) {
  realResultSet = resultSet;
  parentStatement = statement;
  this.sql = sql;
  }
  public boolean absolute(int row) throws SQLException {
  return realResultSet.absolute(row);
  }
  ...
  其中也有一些方法不是简单的托付方法,getStatement()方法返回生成ResultSet的statement对象,我们需要让它返回StatementWrapper对象:
  public Statement getStatement() throws SQLException {
  return parentStatement;
  }
  The getArray() methods need to return a wrapped Array object:
  public Array getArray(int i) throws SQLException {
  return new SQLArrayWrapper(realResultSet.getArray(i), parentStatement, sql);
  }
  public Array getArray(String colName) throws SQLException {
  return new SQLArrayWrapper(realResultSet.getArray(colName), parentStatement, sql);
  }
  最后,我们需要添加测试过程。许多开发人员都错误地认为,不同的Statement.execute*()方法都会引起数据库交互过程带来的负担,对于数据库的更新和读取少量的数据库记录而言,这是正确的。假如读取的数据库记录的量较大,ResultSet.next()需要大量的时间从数据库中读取记录。假如读取的记录太多,ResultSet.next()调用所需要的时间就会多于SQL语句执行的时间。因此,测试ResultSet.next()调用的时间也就是理所当然的了。
  public boolean next() throws SQLException {
  Thread t = Thread.currentThread();
  JDBCLogger.startLogSqlNext(t, sql);
  boolean b = realResultSet.next();
  JDBCLogger.endLogSqlNext(t, sql);
  return b;
  }
  假如需要,还有一些ResultSet调用可以测量,例如previous()、insertRow()等,但大多数的应用程序只需要对next()进行测量。
  JDBC封装类架构
  上面讨论了需要封装的类,我没有明确地说明Array和DatabaseMetaData的封装类,但它们都比较简单,只需要返回ResultSetWrappers和ConnectionWrappers而不是ResultSets和Connections类。使用封装对象测试数据库交互过程性能的技术适用于JDBC 1、JDBC 2和未来的JDBC 3,它们在接口定义方面互不相同(因此需要不同的封装类。但我们可以用同一种方式创建所有不同版本下的封装类。
  我没有讨论的是JDBCLogger,该类的一个简单的实现中不调用测试方法,但将不提供测试功能:
  package tuning.jdbc;
  
  public class JDBCLogger
  {
  public static void startLogSqlQuery(Thread t, String sql) {}
  public static void endLogSqlQuery(Thread t, String sql) {}
  public static void startLogSqlNext(Thread t, String sql) {}
  public static void endLogSqlNext(Thread t, String sql) {}
  }
  一个更有用的定义是测试查询的时间。下面的方法记录查询开始时的时间,并在查询结束时得出使用的时间。由于假定在同一个线程中SQL查询不能递归(一般情况下都是这样的),下面的方法是相当简单的:
  private static Hashtable QueryTime = new Hashtable();
  public static void startLogSqlQuery(Thread t, String sql)
  {
  if (QueryTime.get(t) != null)
  System.out.println("WARNING: overwriting sql query log time for " + sql);
  QueryTime.put(t, new Long(System.currentTimeMillis()));
  }
  public static void endLogSqlQuery(Thread t, String sql)
  {
  long time = System.currentTimeMillis();
  time -= ((Long) QueryTime.get(t)).longValue();
  System.out.println("Time: " + time + " millis for SQL query " + sql);
  QueryTime.remove(t);
  }
  使用JDBCLogger类中的这些方法的输出将如下所示:
  Time: 53 millis for SQL query SELECT * FROM JACKTABL
  对于每次查询执行来说,这将使我们能够精确地测试SQL查询所使用的时间,也能够计算出JDBCLogger类中所有查询所需要的时间。我经常测试的是最小、最大、平均、平均偏差等值,这些值在测试大规模的系统的性能时更有用。
  使用JDBC封装类框架
  我们已经介绍了非常有用的在应用程序的开发和布置阶段测试JDBC调用性能的方法。由于封装类比较简单,而且功能强大,又不需要对应用程序进行大量的修改,它们可以被保留在已经布置好的应用程序中,创建一个可配置的JDBCLogger类将使我们能够根据自己的需要开启或关闭测试功能。
  在开发阶段,由于能够计算出累积的时间代价,我们能够利用这些类辨别出个别的需要较大时间代价的数据库交互过程和重复的数据库交互过程,哪个的时间代价更大。辨别出时间代价较大的数据库交互过程是我们改进应用程序性能的第一步。在开发阶段,这些封装类可以用来发现应用程序的理论性能和实际性能之间的差距,有助于我们分析为什么会有差距。
  在利用这些类找出JDBC的性能瓶颈在哪里后,我们就可以对数据库的接口进行调整了。我将在以后的文章中继续讨论JDBC性能的技术。
上一篇:如何测定JDBC的性能(上) 人气:797
下一篇:J2EE数据库设计入门 人气:503
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-13 爬爬思特新闻管理系统 v2.0 Beta1
2008-10-13 Pligg v9.9.5 Beta
2008-10-13 广优邮件发送系统 v2.1
2008-10-13 缤纷互动视频交友 v3.1 RC
2008-10-13 MyShop网络商城 build 081005
2008-10-13 Chyrp 超轻量级开源博客引擎 v2.
2008-10-13 162100静态(论坛/文章)系统 v2.4
2008-10-13 金博人才招聘求职网黄金版 v4.2
2008-10-13 愚人笔记 v4.0
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成