浅谈JAVA存储过程中数据类型的转换开销 |
| 作者:佚名 文章来源:网络 点击数: 更新时间:2006-4-20 |
|
【摘 要】文章围绕着对JAVA存储过程直接执行SQL语句与调用PL/SQL存储过程执行SQL语句的执行时间分析,研究了JAVA数据类型与ORACLE SQL数据类型之间的类型转换开销,提出了JAVA存储过程设计的基本解决方案。 【关键词】JAVA存储过程;PL/SQL存储过程;KPRB JDBC;数据类型 一、引言 JAVA是面向对象的程序设计语言,所以对数据类型的支持非常强,而ORACLE SQL对不同数据类型的支持比较弱。在JAVA程序中执行一条SQL语句时,要进行由JAVA数据类型到ORACLE SQL数据类型的转换,为了研究这些数据类型的转换开销,这里设计了一组程序对这种开销进行了严格的测试。 JAVA程序在访问ORACLE数据库时,通过JDBC连接数据库,ORACLE提供了四种类型的JDBC驱动程序,其中两种客户端驱动程序和两种服务器端驱动程序。由于利用客户端JAVA驱动程序执行SQL语句时,其主要开销是网络延时和对SQL执行引擎的内部调用,数据类型转换的开销相对于这两种开销就可以忽略了,这样就无法测试出数据类型转换的开销。因此,本文采用服务器端的KPRB JDBC驱动程序进行测试,避免了不必要的网络延时和调用SQL引擎的时间。 如果不存在数据类型转换的开销时,JAVA存储过程通过KPRB JDBC驱动程序直接执行SQL语句与调用PL/SQL过程执行SQL语句的执行时间差别平均在1.5%,这在误差范围内,可以说两者是没有执行效率差别。这里使用PL/SQL作为参照,因为PL/SQL是ORACLE对SQL规范的扩展,他与ORACLE SQL数据类型相同,因此通过PL/SQL执行一条SQL语句不需要任何的数据类型转换。而如果在JAVA存储过程中直接执行SQL语句则需要数据类型的转换,这样通过与PL/SQL作对比就可以精确地测试出数据类型转换的成本。 二、测试与分析 (一)测试的环境 操作系统:Windows2000 Server,数据库:Oracle9i Enterprise Edition Release 9.0.1.1.1,处理器:Inter Pentium IV 2.0G,内存:256 DDR。 (二)测试 下面通过JAVA存储过程直接执行SQL语句和调用PL/SQL过程两种方法从数据库中提取不同量的数据并对数据进行处理,测试出这两种不同方法处理数据的时间。具体方法是首先从数据库中搜索出不同数量的结果集,分别为1000、2000、3000、4000、5000、6000、7000、8000、9000、10000条,将这些结果集分别赋值给JAVA变量和PL/SQL变量,记录他们的执行时间,为了使测试更准确,在外层又进行了10次循环,最终分别计算出对1000~10000条记录执行的平均时间。测试的核心代码如下: 1.下面是测试JAVA存储过程直接执行SQL语句的执行开销的核心代码: public static void execute (int count) throws SQLException{ //prepare database calls if(conn==null){ conn=DriverManager.getConnection("jdbc:oracle:kprb:@"); pstmt1=conn.prepareStatement("select y from scott.data where x"); } //start the measurements long time; long timestamp = System.currentTimeMillis(); String y; pstmt1.setInt(1,count); ResultSet rs = pstmt1.executeQuery(); while(rs.next()){ y=rs.getString("y"); } rs.close(); //log the time this took time=System.currentTimeMillis() - timestamp; } JAVA存储过程的PL/SQL调用规范中的调用JAVA存储过程的核心代码为: for i in 1..10 loop jdbc_rs_execute(1000); jdbc_rs_execute(2000); …… jdbc_rs_execute(10000); end loop; 2.下面是测试JAVA存储过程通过调用PL/SQL过程来执行SQL语句的执行开销的核心代码: PL/SQL存储过程的代码: create or replace procedure jdbc_rs_test(cnt number) as str scott.data.y%TYPE; type rcur is ref cursor; cur rcur; begin open cur for select y from scott.data where x loop fetch cur into num,str; exit when cur%notfound; end loop; close cur; end; JAVA存储过程中调用PL/SQL的核心代码: public static void execute (int count) throws SQLException{ //start the measurements long time;long timestamp=System.currentTimeMillis(); //prepare database calls if(cstmt==null){ conn=DriverManager.getConnection("jdbc:oracle:kprb:@"); cstmt=conn.prepareCall("begin jdbc_rs_test(?);end;");} //execute the statement cstmt.setInt(1,count); cstmt.execute(); //log the time this took time = System.currentTimeMillis() - timestamp; } JAVA存储过程的PL/SQL调用规范中的调用JAVA存储过程的核心代码为: for i in 1..10 loop plsql_rs_execute(1000); plsql_rs_execute(2000); …… plsql_rs_execute(10000); end loop; 两种执行方式的测试结果如下: 表1中X代表处理记录数、JAVA代表从JAVA存储过程中直接执行SQL语句来处理数据的时间、PL/SQL代表从JAVA存储过程中调用PL/SQL过程来处理数据的时间、PL/SQL-JAVA是两者执行时间差、(PL/SQL-JAVA)/JAVA*100是指通过PL/SQL处理数据比直接执行SQL处理数据减少开销的百分率。 表1 (y字段宽度为1)
表2 (y字段宽度为500)
图1表1中测试数据的效果图 图2 表2中测试数据的效果图 与上面的测试一样,改变y字段宽度为1000和1500时平均减少的开销分别为60.2%和65.8%。同样当对两列宽度为1的结果集进行处理时,利用PL/SQL过程来执行SQL语句平均达到减少37.9%的开销,三列时为47.6%,四列时为53.5%。 (三)分析 在JAVA存储过程中直接执行SQL语句并利用中间结果时,首先必须从基本表中查询出结果集,然后将结果传递到JVM,在这传递过程中,需要将数据从SQL数据类型转换成JAVA数据类型,若将JAVA中处理过的数据重新写入数据库,还要进行一次JAVA数据类型到SQL数据类型的转换,这种开销在服务器端的JAVA存储过程执行总开销中占据很大一部分。虽然,这种数据类型转换的开销相对于客户端的执行的SQL语句网络开销已经微不足道,但对于提高服务器端的JAVA存储过程的性能来说,它却起着决定性因素。从表1和表2测试数据我们可以看出随着在SQL引擎与JVM之间传递数据量的增加,执行成本也随之大幅度增长,与之相应,由于通过PL/SQL执行SQL语句时不存在数据类型转换的开销,因此数据量的增加执行成本只有少量增加,图1和图2清楚地反映了这样的变化。这样当需要转换的数据量很多时,通过调用PL/SQL存储过程来执行SQL语句将会大幅减少执行成本,如在字段宽度为1500时,利用PL/SQL过程来执行SQL语句平均达到减少65.8%的开销。 三、结论 因此,设计JAVA存储过程应尽可能地减少JVM与SQL引擎之间大量的数据传递。在需要处理一组有大量中间结果的数据的语句时,应该使用PL/SQL来访问数据库,这样将会带来性能上的提高。但是,如果每一个SQL语句都需要与java环境集成(能过输入参数或返回输出),通过将其组成PL/SQL过程只能获得很小的或者没有性能提高,因为不可避免的数据类型转换的成本是限制因素。 虽然JAVA在访问数据库的性能方面不如PL/SQL,但JAVA比PL/SQL提供了更广泛的功能,具有更好的访问外部资源的能力,例如文件和套接字。JAVA还考虑了一些粒度精细的安全政策和有重要的资源参与工作等等。 最后必须记住:PL/SQL数据类型与SQL执行引擎紧密集成,在处理数据时不存在数据类型转换的开销,这意味着,执行SQL时,PL/SQL始终比java更胜一筹。不能用JAVA存储过程来取代PL/SQL存储过程,JAVA存储过程只是扩展了PL/SQL的功能,在PL/SQL过程不能完成或很难完成的任务应该充分使用JAVA的扩展功能来实现。
【参考文献】 [1]John O'Donahue.Java数据库编程宝典[M].甄广启,于耀,等,译.北京:电子工业出版社,2003. |
| 论文录入:华东论文网 责任编辑:华东论文网 |
|
上一篇论文: ASP制作学生档案管理系统
下一篇论文: 计算机毕业论文-基于WEB的劳资人事管理系统 |
|
|
| 【字体:小 大】【发表评论】【告诉好友】【打印此文】【关闭窗口】 |