“绑定变量”这个词也许对于某些人来讲看以来陌生,其实咱们在很早的时候就已经开始运用它了。java
在java中使用的PrepareStatement对象,你们必定会说这不是将sql语句作预编译操做嘛,被封装的sql语句能够包含动参数,减小编译的次数,提升数据库性能,减轻jvm的负荷。sql
其实“绑定变量”的用途就是如上边所说。数据库
那么咱们用到它的前提是,大量批量操做,条件相同,但参数值不一样。oracle
网上有这样的例子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"); } }