`
bestxiaok
  • 浏览: 443571 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA 程序中使用ORACLE 绑定变量( bind variable )

阅读更多

1、为什么要使用绑定变量

      (1)SQL语 句硬分析(Hard Parse)太多,严重消耗CPU资源,延长了SQL语句总的执行时间

        SQL语句的执行过程分几个步骤:语法检查、分析、执行、 返回结果。其中分析分为硬分析(Hard Parse)和软分析(Soft Parse)。一条SQL语句通过语法检查后,Oracle 会先去shared pool 中找是否有相同的sql,如果找着了,就叫软分析,然后执行SQL语句。硬分析主要是检查该sql所涉及到的所有对象是否有效以及权限等关系,然后根据RBO或CBO模 式生成执行计划,然后才执行SQL语 句。

   可以看出,硬分析比软分析多了很多动作, 而这里面的关键是“在shared pool 中是否有相同的sql”,而这就取决于是否使用绑定变量。

      另:oracle9i引入了soft soft parse,先到pga中的session cursor cache list列表中去查找(session cursor cache list的长度是由session_cache_cursor参数决定的),如果没有找到这条sql,这时候才去检查shard_pool.   对于Oltp系统,很多时候硬分析的代价比执行还要高,这个我们可以通过10046事件跟踪得知。



    (2)共享池中SQL语 句数量太多,重用性极低,加速了SQL语 句的老化,导致共享池碎片过多。

      共享池中不同的SQL语句数量巨大,根据LRU原则,一些语句逐渐老化,最终被清理出共享池;这样就导致shared_pool_size 里面命中率下降,共享池碎片增多,可用内存空间不足。而为了维护共享池内部结构,需要 使用latch,一种内部生命周期很短的lock,这将使用大量的cpu 资源,使得性能急剧下降。

      不使用绑定变量违背了oracle 的shared pool 的设计的原则,违背了这个设计用来共享的思想。



2、怎么查看没有使用绑定变量

select * from v$sql or v$sqlarea 查看是否有很多类似的语句,除 了变量不一样,其他的都一样



3、如何使用绑定变量?

编 写java 程序时,我们习惯都是定义JAVA 的程序变量,放入SQL 语句中,如

String v_id = 'xxxxx';

String v_sql = 'select name from table_a where id = ' + v_id ;



以 上代码,看起来是使用了变量v_id ,但这却是java 的程序变量,而不是oracle 的绑定变量,语句传递到数据库后,此java 的程序变量

已经被替换成具 体的常量值,变成:

select * from table_a where name = 'xxxxx' ;



假 定这个语句第一次执行,会进行硬分析。后来,同一段java 代码中v_id 值发现变化(v_id = 'yyyyyy'),数据库又接收到这样的语句:

select * from table_a where name = 'yyyyyy' ;



ORACLE 并不认为以上两条语句是相同的语句,因此对第二条语句会又做一次硬分析。这两条语句的执 行计划可是一样的!

其 实,只需将以上java 代码改成以下这样,就使用了oracle 的绑定变量:

String v_id = 'xxxxx';

String v_sql = 'select name from table_a where id = ? '; //嵌入绑定变量

stmt = con.prepareStatement( v_sql );

stmt.setString(1, v_id ); //为绑定变量赋值

stmt.executeQuery();



在Java中,结合使用setXXX 系列方法,可以为不同数据类型的绑定变量进行赋值,从而大大优化了SQL 语句的性能。



4、java中 应用绑定变量的例子

PreparedStatement stmt = conn.prepareStatement('select a from b where c = ? ');

stmt.setLong(1,123);

stmt.executeQuery()

……





结论:



    绑定变量主要适用在Oltp,运行时间很短的系统。如客服系统,时时地进行insert方面的系统。 数 据仓库系统不适用,和数据库仓库系统的一条sql运 行时间相比,硬分析的代价显然是微不足道的,通过硬分析去选择正确的执行计划才是关键。

  简 单一句话,在Oltp系统中应用绑定变量,性能会有质的提高。
分享到:
评论

相关推荐

    Oracle 中的变量绑定

    Oracle 中关于变量绑定的解释说明,还是蛮清楚的学习资料。

    Linux网络编程:绑定( bind )需要注意的问题

    Linux网络编程:绑定( bind )需要注意的问题, 相关教程链接如下: http://blog.csdn.net/tennysonsky/article/details/44057585

    jquery使用bind绑定事件

    为页面标签使用bind绑定事件,使用jquery改变单行文本框的背景色

    bind.exe 修改默认绑定IP的东东

    影响范围:当前用户所有从explorer.exe中运行的所有程序、子程序、子子程序。 对于ctrl+alt+del然后运行任务管理器,并从任务管理器中启动的程序无效。 如果是终端服务器,当前用户不影响其他登录的用户。 不影响...

    JAVA_API1.6文档(中文)

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    jquery绑定事件 bind和on的用法与区别分析

    本文实例讲述了jquery绑定事件 bind和on的用法与区别。分享给大家供大家参考,具体如下: bind和on都是给元素绑定事件用的,其最大的区别就是事件冒泡 事件冒泡也是委托事件的原型,事件委托就是子类的事情委托给父类...

    BIND9 中文手册

    BIND9中文手册 BIND9中文手册 BIND9中文手册 BIND9中文手册 BIND9中文手册

    C++中使用function和bind绑定类成员函数的方法详解

    定义一个普通的类 ...输出的值是2,说明pf传进去的4并没有什么用,在bind的时候值已经绑定死了,但是pf()这样不给参数会报错。 如果我们想自定义参数,使用占位符,std::placeholders::_1,可以看

    bind和drive绑定到控件上.zip

    RxSwift bind和drive绑定系统控件和自定义控件教程demo代码.演示了使用drive和bind绑定系统控件和自定义控件方法,加了很详细的注释

    AM User-bind命令完成IP、MAC地址和端口绑定配置网络管理

    AM User-bind命令完成IP、MAC地址和端口绑定配置网络管理

    bind bind bind bind

    bind bind bind bind

    JavaAPI1.6中文chm文档 part1

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    Java 1.6 API 中文 New

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    jQuery中绑定事件bind() on() live() one()的异同

    本文主要介绍了jQuery中绑定事件bind() on() live() one()的异同,具有很好的参考价值,下面跟着小编一起来看下吧

    Asp.net中的数据绑定Eval和Bind应用示例

    Bind (双向绑定)双向的数据绑定除了展示数据,还要将界面数据的变动自动写回到绑定的数据源中。 Eval 单向数据绑定,将数据源中的数据展现到界面上。当我们提及数据展现时,必然会考虑到数据的格式问题,例如日期...

    auto-bind, 自动将方法绑定到它们的类实例.zip

    auto-bind, 自动将方法绑定到它们的类实例 自动绑定 自动将方法绑定到它们的类实例安装$ npm install auto-bind用法const autoBind = require('auto-bind');class Unicorn

    jakarta.xml.bind-api-2.3.3-API文档-中文版.zip

    标签:bind、xml、api、jakarta、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请...

    利用bind+dhcpd实现域名动态绑定

    利用bind+dhcpd实现域名动态绑定

    Flex Bind数据绑定实例代码

    Flex Bind数据绑定实例代码 ActionScript 3.0

Global site tag (gtag.js) - Google Analytics