四年专业论文网,提供各种免费论文及范文报告下载及代写论文服务,包括硕士论文,毕业论文,职称论文,英语论文

加入收藏 | 网站地图 | 在线留言
华东论文网网站LOGO 代写论文论文定制 发表论文发表论文 合作流程合作流程 付款方式付款方式 信用说明信用说明 刊物介绍刊物介绍
本站公告: 热烈庆祝华东论文网新版上线 [华东论文网 2008年6月16日] 欢迎光临华东论文网-专业的代写论文网 [华东论文网 2007年10月21日] 欢迎广大网友来投稿! [华东论文网 2006年11月10日] 为您提供高质量的代写论文服务 [华东论文网 2007年10月20日] 代写论文 论文定制 发表论文 发表论文 诚邀合作 诚邀合作
您现在的位置: 代写论文 >> 免费论文 >> 计算机类 >> 程序编程 >> 正文
热门文章
推荐文章
论文网栏目 毕业论文选题指导 浅谈JAVA存储过程中数据类型的转换开销 论文网栏目

浅谈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的劳资人事管理系统
  • Google
    【字体: 】【发表评论】【告诉好友】【打印此文】【关闭窗口
    联系我们 | 版权申明 | 友情链接 | 关于论文网 | 网站地图 | 银行汇款说明 | 加盟笔杆子说明

    客服电话:13886096221(全天) QQ在线客服:论文代写在线QQ50403530 联系邮箱:hdlww@hdlww.com
    CopyRight (C)2004-2008 Www.hdlww.Com All Rights Reserved.. 浙ICP备05017412号
    所有论文资料均源于网上的共享资源及期刊共享,请特别注意勿做其他非法用途
    如有侵犯您的版权或其他有损您利益的行为,请联系指出,华东论文网会立即进行改正或删除有关内容
    本站关键词:

    论文网 硕士论文 毕业论文 职称论文 英语论文 代写论文