如何测定JDBC的性能

Java数据库连接(JDBC)被广泛用在Java应用程序中。在本篇文章中,我们将讨论如何测定JDBC的性能,如何判断JDBC子系统中的哪一部分需要进行优化。

核心的java.sql界面

我们的目的是提高应用程序的性能。一般情况下,我们需要对应用程序进行分析,找出其中的瓶颈。当然了,要对分布式应用程序进行有效的分析是比较困难的,I/O是分析的一个重点,这是由分布式应用程序的特点决定的,分布式应用程序中的线程需要花费大量的时间等待I/O操作。目前还不清楚线程因等待读、写操作而阻塞是瓶颈的一部分呢还是一个无关紧要的小问题。在进行分析时,有一个独立的通信系统测试标准是重要的。那么在测试JDBC子系统的性能时,我们应当测试哪些指标呢?

在java.sql软件包中,有三个接口组成了JDBC的核心:Connection、Statement和ResultSet。与数据库的正常交互包括下面的几部分:

·从数据库驱动程序中获得一个Connection对象。

·从Connection对象中获取能够执行指定的SQL语句的Statement对象

·如果SQL语句需要从数据库中读取数据,则使用Statement对象获取一个提供对数据库中的数据进行访问的ResultSet对象。

下面的例子通过访问指定数据库表的每行记录的所有域、将每行的数据存储到String []、并将所有的行放到一个向量中,演示了标准的数据库交互过程。

public static Vector getATable(String tablename, Connection Connection)
throws SQLException
{
String sqlQuery = "SELECT * FROM " + tablename;
Statement statement = Connection.createStatement();
ResultSet resultSet = statement.executeQuery(sqlQuery);
int numColumns = resultSet.getMetaData().getColumnCount();
String[] aRow;
Vector allRows = new Vector();
while(resultSet.next())
{
aRow = new String[numColumns];
for (int i = 0; i < numColumns; i++)
file://ResultSet的访问是从1开始的,数组是从0开始的。
aRow[i] = resultSet.getString(i+1);
allRows.addElement(aRow);
}
return allRows;
}

在java.sql或其他的SDK中没有Connection、Statement和ResultSet这三个对象的具体实现,这些对象以及其他的JDBC接口都是由数据库驱动程序的厂商开发的,并被作为数据库驱动程序的一部分包括在驱动程序软件包中。如果要打印出Connection对象或使用的其他对象的类名,可能会看到类似XXXConnection、XXXStatement、XXXConnectionImpl、XXXStatementImpl等字符串,其中的XXX就是正在使用的数据库的名字,例如Oracle。

如果我们要测试例子中getATable()方法的JDBC的性能,可以简单地在该方法的开始处和末尾处添加System.currentTimeMillis(),二者之间的时间差就是getATable()方法执行所使用的时间。只要数据库的交互过程与其他过程没有搅和在一起,就可以使用这种方法测试一个方法的JDBC性能。但通常情况下,Java应用程序的的数据库交互过程分布在许多类的许多方法中,而且很难将数据库交互过程单独分离出来。那么在这种情况下我们应该如何测试数据库交互过程的性能呢?

一个理想的方法是在所有的JDBC类中都内置测量性能的能力,然后可以在需要对其性能进行监测时简单地打开监测功能就可以了。正常情况下,JDBC类没有提供这种能力,但我们可以使用具备这种功能的类来替换它们,我们替换类的目标是提供与Proxy非常相似的对象。

使用一个接口的专用封装对象封装该接口的对象是一种有多种用途的成熟技术,collection类同步的封装对象就是最著名的一个例子,但还有其他许多用途。SDK中甚至有一个专门在运行时才生成封装对象的类:java.lang.reflect.Proxy类。封装对象也被称作代理对象,如果在本篇文章中使用代理对象这个术语,会使对封装JDBC对象的解释更复杂,因此,在本篇文章中仍然会坚持使用封装类。

要在上述功能的基础上添加测试数据库交互过程的功能,还需要对应用程序的其他部分作一些改变,很明显的是,这样作需要一定的代价。

幸运的是,当一个框架象JDBC那样几乎完全采用接口来定义时,要用另外的实现替换其中的作一个类就相当简单了。我们可以使用一个封装类替换一个接口的任何一种实现,该封装类封装原有的类,并转发所有对原来类的方法的调用。在本篇文章中,我们可以使用一个封装类替换掉JDBC类,将我们监测JDBC性能的功能放置在封装类中,然后使监测功能随整个应用程序的执行而执行。

时间: 2024-08-29 12:13:28

如何测定JDBC的性能的相关文章

JDBC优化策略总结

相比Hibernate.iBatis.DBUtils等,理论上JDBC的性能都超过它们.JDBC提供更底层更精细的数据访问策略,这是Hibernate等框架所不具备的. 在一些高性能的数据操作中,越高级的框架越不适合使用.这里是我在开发中对JDBC使用过程中一些优化经验总结. 1.选择纯Java的JDBC驱动. 2.使用连接池--使用一个"池"来管理JDBC连接,并精心调试池配置的参数,目前可用的数据库连接池很多很多. 如何配置合适的参数呢,需要的是测试,而不是感觉. 3.重用Conn

JDBC内存管理—varchar2(4000)的影响

        今天在项目评审中遇到到一个问题,一个表的字段如comment,开发想用varchar2(4000),而我建议在满足应用场景的情况下,尽量减少长度,当时就抛出了一个问题,varchar2(4000)和varchar2(40)那个好,当时我也只是简单的回答了一下,说道varchar2(xx)的字段会在内存中分配空间大小为字段定义的长度.  回来后有想了想,自己也没有弄清楚其中的原来,于是问了问同事,查了查资料,说法都有理,如索引长度的限制 ,可以作为数据库层面的约束啊等等.最后还是翻

Oracle JDBC版本区别(转)

oracle\product\11.2.0\dbhome_1\jdbc\lib ojdbc5.jar ojdbc5dms.jar ojdbc5dms_g.jar ojdbc5_g.jar ojdbc6.jar ojdbc6dms.jar ojdbc6dms_g.jar ojdbc6_g.jar simplefan.jar   在使用Oracle JDBC驱动时,有些问题你是不是通过替换不同版本的Oracle JDBC驱动来解决的?最常使用的ojdbc14.jar有多个版本,classes12.j

ORACLE的jdbc版本

classes12.jar,ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别,之间的差异 作者:赵磊 博客:http://elf8848.iteye.com 在使用Oracle JDBC驱动时,有些问题你是不是通过替换不同版本的Oracle JDBC驱动来解决的?最常使用的ojdbc14.jar有多个版本,classes12.jar有多个版本你了解吗? 连接类型:1.JDBC OCI: oci是oracle call interface的缩写,此驱动类似于传统的ODBC

【数据蒋堂】功夫都在报表外--漫谈报表性能优化

应用系统中的报表,作为面向业务用户的窗口,其性能一直被高度关注.用户输入参数后都希望立即就能看到统计查询结果,等个十几二十秒还能接受,等到三五分钟的用户体验就非常恶劣了. 那么,报表为什么会慢,又应当从哪里入手进行性能调优呢? 数据准备 当前应用中的报表大都用报表工具开发,当报表响应太慢时,不明就里的用户就会把矛头指向使用报表工具的开发人员或者报表工具厂商.其实,大多数情况报表的慢只是个表现,背后的原因是数据准备太慢,在数据进入报表环节之前就已经慢了,这时再去优化报表开发或压迫报表工具并没有用处

【数据蒋堂】第3期:功夫都在报表外-漫谈报表性能优化

应用系统中的报表,作为面向业务用户的窗口,其性能一直被高度关注.用户输入参数后都希望立即就能看到统计查询结果,等个十几二十秒还能接受,等到三五分钟的用户体验就非常恶劣了. 那么,报表为什么会慢,又应当从哪里入手进行性能调优呢? 数据准备 当前应用中的报表大都用报表工具开发,当报表响应太慢时,不明就里的用户就会把矛头指向使用报表工具的开发人员或者报表工具厂商.其实,大多数情况报表的慢只是个表现,背后的原因是数据准备太慢,在数据进入报表环节之前就已经慢了,这时再去优化报表开发或压迫报表工具并没有用处

Introducing to Spring Framework

Introducing to Spring Framework 作者:Rod Johnson 译者:yanger,taowen 校对:taowen 关于Spring Framework,今年夏天你可能已经听见很多的议论.在本文中,我将试图解释Spring能完成什么,和我怎么会认为它能帮助你开发J2EE应用程序. 又来一个framework? 你可能正在想"不过是另外一个的framework".当已经有许多开放源代码(和专有) J2EE framework时,为什么你还要耐下心子读这篇文

轻量级数据库中间件利器Sharding-JDBC深度解析(有彩蛋)

讲师介绍 张亮 当当架构部总监 负责分布式中间件和私有云平台建设 目前主导开源项目:Elastic-Job及Sharding-JDBC  主题简介: 1.关系型数据库中间件核心功能介绍 2.Sharding-JDBC架构及内核解析 3.Sharding-JDBC未来展望 一.关系型数据库中间件核心功能介绍 关系型数据库凭借灵活查询的SQL和稳定的存储及事务引擎,一直以来是业务存储领域的首选.而在规模越来越大的互联网年代,单一的关系型数据库却已难满足需求.开发人员不愿放弃SQL查询的灵活度及对之前

迈普 Web 软件开发框架 v 2.0 白 皮 书

一. 缘 起 在市场经济大环境下,如何缩短工期.降低成本,并提高开发效率? 开发上线后的软件,怎样最大限度降低维护成本,并提高IT企业投资回报率? 怎样迅速响应市场需求变化,为IT企业赢得持续的管理改善和商机? 面对传统开发方法和技术,IT 人员显得很无奈:团队成长问题,人员变更交接问题,没有一个稳定强大的.可扩展性强的软件开发框架,团队的精力就很容易被消耗在重复开发上,没有积累重用,更易造成时间浪费.财力浪费.消极影响严重. IT 企业战略重点是做好某软件的应用规划和软件技术基础架构规划,为软