“绑定变量”这个词也许对于某些人来说看以来陌生,其实我们在很早的时候就已经开始运用它了。

在java中使用的PrepareStatement对象,大家一定会说这不是将sql语句做预编译操作嘛,被封装的sql语句可以包含动参数,减少编译的次数,提高数据库性能,减轻jvm的负荷。

其实“绑定变量”的用途就是如上边所说。

那么我们用到它的前提是,大量批量操作,条件相同,但参数值不同。

网上有这样的例子

CREATE TABLE TTT1 (X INT);

CREATE OR REPLACE PROCEDURE PROC1
AS
BEGIN
FOR i IN 1 .. 100000
LOOP
EXECUTE IMMEDIATE 'INSERT INTO TTT1 VALUES(:X)' USING i;
END LOOP;
END;
/ CREATE OR REPLACE PROCEDURE PROC2
AS
BEGIN
FOR i IN 1 .. 100000
LOOP
EXECUTE IMMEDIATE 'INSERT INTO TTT1 VALUES('||i||')';
END LOOP;
END;
/ 两个存储过程都很简单,都是向表TTT1中插入1-100000条记录,唯一的不同是proc1使用了绑定变量:x,proc2没有使用绑定变量,我们来简单的看一下执行时间:
ETL@DWTEST> EXEC PROC1; PL/SQL procedure successfully completed. Elapsed: 00:00:02.80
ETL@DWTEST> EXEC PROC2; PL/SQL procedure successfully completed. Elapsed: 00:00:06.27 可以看到PROC2的执行时间几乎是PROC1执行时间的3倍!
TOM曾说过:Oracle 将已解析、已编译的SQL 连同其他内容存储在共享池(shared pool)中,这是系统全局区(System Global Area ,SGA)中一个非常重要的共享内存结构。如果你确实想让Oracle 缓慢地运行,甚至几近停顿,只要根本不使用绑定变量就可以办到。
如果使用绑定变量,无论是谁,只要提交引用同一对象的同一个查询,都会使用共享池中已编译的查询计划。这样你的子例程只编译一次就可以反复使用。这样做效率很高,这也正是数据库期望你采用的做法。你使用的资源会更少(软解析耗费的资源相当少),不仅如此,占用闩的时间也更短,而且不再那么频繁地需要闩。这些都会改善应用的性能和可扩缩性。
实际上,proc2 需要的时间几乎是proc1 的3 倍,这说明,在这种情况下,对于每个“无绑定变量”的INSERT,执行语句所需时间中有2/3 仅用于解析语句!因此,请检查一下我们曾经写过的程序,看一看是否可以使用绑定变量,如果真的可以使用绑定变量,那我确信程序经过修改可以提高一大截性能!

  

JAVA中绑定变量的测试代码
2012-04-12 11:54 达内培训 写这篇文章的目的并不想为你讲述什么样的知识,只是希望为你提供帮助。大家可以将代码测试一下,理解其实现原理,对大家学习肯定能有所帮助
一段在JAVA中绑定变量的测试代码,达内培训为你整理。
import java.sql.*;
import oracle.jdbc.driver.*;
class ConOra {
public static void main(String args[] ) throws SQLException{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.152:1521:whx","system","lukewhx");
PreparedStatement stmt ;
ResultSet rset ;
String v_sql;
/*
for (int i =1;i<=1000;i++){
v_sql="select object_name from objects where object_id="+i;
stmt =conn.prepareStatement(v_sql);
rset=stmt.executeQuery();
stmt.close();
}
*/
for (int i =1 ;i<=1000;i++ ) {
v_sql = "select object_name from objects where object_id= :x ";
stmt=conn.prepareStatement(v_sql);
stmt.setString(1,Integer.toString(i));
rset = stmt.executeQuery();
stmt.close();
}
System.out.println("Execute OK");
}
}

  

最新文章

  1. PyCharm断点调试django
  2. Hibernate之lazy延迟加载(转)
  3. javascript随手记
  4. 吉哥系列故事——完美队形II
  5. 用c写99乘法表
  6. cocos2dx 3.0 它 使用std::bind更换CC_CALLBACK_N
  7. UINavigationBar
  8. java中使用fastjson、jackson、json-lib解析JSON-------------------妈妈再也不用担心JSON解析
  9. Ubuntu中启用ssh服务---转载
  10. QA问答系统,QA匹配论文学习笔记
  11. java Domj4读取xml文件
  12. 生成网上下载的EF项目对应的数据库
  13. es6模块与 commonJS规范的区别
  14. a file was not found
  15. httpclient Accept-Encoding 乱码
  16. JavaWeb-入门第一课-1.静态web动态web 2.web服务器 3.下载和安装Tomcat-web服务器
  17. 第一个struct2程序
  18. 马婕 2014MBA专硕考试 报刊选读 4 朝鲜战争会爆发吗?(转)
  19. Go net/http获取body中json格式数据
  20. mac配置python自然语言处理环境

热门文章

  1. mysql分区功能详细介绍,以及实例
  2. Microsoft_Sql_Server_2008:无法对数据库执行删除,因为它正用于复制
  3. swift-06-字符串,字符以及元组类型
  4. Codevs 1800 假面舞会 2008年NOI全国竞赛
  5. 新建DragonBones动画文件
  6. 文件打开方式O_DSYNC、O_RSYNC、O_SYNC
  7. 快速设置IP的脚本
  8. 可视化查看MongoDB - MongoVUE
  9. 如何彻底删除PPA软件库
  10. keilkill.bat