`

绑定参数的SQL

阅读更多
Java代码 复制代码
  1. select sql_text ,sharable_mem from v$sql where sharable_mem > '100000' order by sharable_mem ;   
select sql_text ,sharable_mem from v$sql where sharable_mem > '100000' order by sharable_mem ; 


上面的sql语句是查询shared pool中占用内存超过100K的sql语句。

        共享池主要由库缓冲区(共享SQL区和PL/SQL区)和数据字典缓冲区组成。

     select * from v$sgastat; --显式SGA的状态信息。

If the SHARED_POOL_SIZE is large enough, most ORA-04031 errors are a result of  dynamic sql fragmenting the shared pool.  This can be caused by:

        o Not sharing SQL
        o Making unnecessary parse calls (soft)
        o Not using bind variables

ava代码 复制代码

  1. select * from table_name where id = 1;    
  2. select * from table_name where id = 2;   
select * from table_name where id = 1; 
select * from table_name where id = 2; 

每次查询都要进行sql语句的执行解析,并且每个sql都会分配一个区域来存放sql解析后的二进制可执行代码。试想,要是id不同的10万个sql呢?Oracle就会分配10万个sql区域来分别存放10万个这样的id不同的sql语句。对于一个数据库驱动的Web网站这样情况下,SGA开的再大,也会很快被耗尽share pool的,最后报一个ORA-4031错误。数据库就连接不上了,只好重起。

正确的写法应该是:

Java代码 复制代码
  1. PreparedStatement pstmt = conn.prepareStatement("select * from table_name where id = ?");;    
  2.   
  3. pstmt.setInt(1,1);;    
  4. rset = pstmt.executeQuery();;    
  5. ...    
  6. pstmt.setInt(1,2);;    
  7. rset = pstmt.executeQuery();;   
PreparedStatement pstmt = conn.prepareStatement("select * from table_name where id = ?");; 

pstmt.setInt(1,1);; 
rset = pstmt.executeQuery();; 
... 
pstmt.setInt(1,2);; 
rset = pstmt.executeQuery();; 


这样Oracle数据库就知道你实际上用的都是同一条sql语句,会以这样的形式:
select * from table_name where id = :1
解析执行后存放在sql区域里面,当以后再有一样的sql的时候,把参数替换一下,就立刻执行,不需要再解析sql了。既加快了sql执行速度,也不会占有过多SGA的share pool。

分享到:
评论

相关推荐

    动态SQL与绑定变量

    动态SQL与绑定变量是数据库编程中的重要概念,尤其在Oracle数据库中被广泛应用。动态SQL允许在运行时构建和执行SQL语句,而绑定变量则是在动态SQL中用于替代具体值的占位符,使得SQL语句更为灵活和高效。 ### 1. ...

    sql绑定变量

    绑定变量允许在SQL语句中使用程序变量作为参数,这不仅提高了代码的可读性和维护性,还增强了SQL语句的灵活性和效率。 ### SQL绑定变量的重要性 在数据库操作中,频繁地执行相同或相似的SQL语句会消耗大量的系统...

    C# dataGridView1 控件的使用SQL Server数据绑定

    ### C#中dataGridView1控件的使用与SQL Server数据绑定详解 #### 一、概述 在C#开发中,利用dataGridView1控件进行SQL Server数据库的数据绑定是非常常见且实用的操作方式之一。它可以帮助开发者轻松地将数据库中...

    动态SQL 并且把返回的值赋给变量

    它提供了一种安全的方式来自定义和执行动态SQL,同时还可以绑定参数,避免了SQL注入的问题。 #### `sp_executesql`的基本语法 `sp_executesql`的基本语法如下: ```sql sp_executesql @stmt = N'<your SQL ...

    spring mvc 参数绑定漏洞

    2. **未校验输入**:如果没有对用户输入进行适当的验证,恶意用户可以篡改请求参数,可能导致权限提升、数据泄露或注入攻击(如SQL注入、命令注入)。 3. **默认配置不当**:Spring MVC的默认配置可能允许过于宽松的...

    Embedded SQLC开发手册.pdf

    // 绑定参数 SQLCHAR param[50]; strcpy(param, "value"); // 执行查询 rc = sqlcoci(&sqlca, query); if (rc == SQL_SUCCESS) { // 绑定结果集 SQLCHAR result[100]; rc = sqlcoci(&sqlca, &param, &...

    让hibernate输出sql语句参数配置.doc

    hibernate.session_factory_name 参数用于 SessionFactory 创建后,将自动使用这个名字绑定到 JNDI 中。其取值为 jndi/composite/name。 7. hibernate.max_fetch_depth hibernate.max_fetch_depth 参数用于设置...

    获取操作数据库的sql并输出带参数的

    `是参数化SQL,`setString(1, "testUser")`将字符串`"testUser"`安全地绑定到第一个占位符上。 在实际应用中,我们还需要关注SQL性能优化,例如,使用索引、避免全表扫描、合理设计数据类型等。对于复杂查询,可以...

    ASP.NET绑定sql数据库采用echarts显示数据图表(实现了柱状图和饼图).zip

    3. 数据库连接与查询:SQL语句的编写,使用参数化查询防止SQL注入。 4. 数据绑定:将数据库数据绑定到ECharts图表,如使用`JsonResult`返回JSON数据。 5. ECharts使用:配置图表选项,理解各种图表属性,如系列、轴...

    oracle 数据库的绑定变量特性及应用

    ```sql declare type rc is ref cursor; l_rc rc; l_dummy all_objects.object_name%type; l_start number default dbms_utility.get_time; begin for i in 1 .. 1000 loop open l_rc for 'select object_...

    birt数据集参数与列绑定实现

    在BIRT(Business Intelligence and Reporting Tools)中,数据集参数与列绑定是构建复杂报告的关键技术。本主题将深入探讨如何实现数据集之间的参数传递以及列的绑定,以充分利用BIRT的功能来创建高效的报告。 ...

    mybatis-plus配置控制台打印完整带参数SQL语句的实现

    因此,输出完整的带参数SQL语句对于调试和优化至关重要。 解决方案是通过配置MyBatis-Plus的日志实现来达到目的。MyBatis-Plus内部使用了MyBatis的日志工厂,该工厂支持多种日志框架,包括SLF4J、Apache Commons ...

    修改请求参数 防止 SQL 注入、防止脚本注入

    此外,还可以使用参数绑定或者ORM框架(如Hibernate)来处理用户输入,这些方法都会自动处理潜在的SQL注入风险。 接下来,我们讨论一下跨站脚本(XSS)攻击。XSS攻击发生在攻击者将恶意脚本插入到其他用户看到的...

    jinjasql:具有自动绑定参数提取SQL模板语言

    JinjaSQL实际上并不执行查询-它仅准备查询和绑定参数。 您可以使用任何正在使用的数据库引擎/驱动程序执行查询。 例如,如果您有这样的模板- select username, sum (spend) from transactions where start_date > ...

    在Java中实现Oracle变量的绑定方法 .doc

    在Java中实现Oracle变量的绑定方法,主要是为了优化SQL语句的执行效率,减少数据库解析负担,提升系统性能。Oracle数据库在处理SQL语句时,会先进行解析,然后将解析后的SQL语句存储在共享池(Shared Pool)中。如果...

    SQL Server SQL性能优化之参数化

    SQL Server的性能优化是数据库管理中的重要环节,其中参数化是一种有效的优化策略。参数化主要涉及两种模式:简单模式和强制模式。默认情况下,SQL Server采用简单参数化,这意味着如果收到的SQL语句与之前执行过的...

    sqlapi 源码

    2.fetch.cpp文件主要是关于api的基本操作,包括连接数据库,sql语句的执行,绑定sql语句参数的方法,获取结果的方法,以及结果中字段的处理,断开连接,以及异常的处理。 3.sqlapi.cpp文件主要测试数据库优化的性能...

    防止sql注入解决方案

    框架如Hibernate、MyBatis等在设计时已考虑了SQL注入问题,它们会自动处理预编译语句和参数绑定,减少开发者的安全顾虑。 6. **最小权限原则**: 数据库连接应使用具有最小权限的账户,这样即使发生SQL注入,攻击...

    SQL数据库表互导(实现字段绑定,新建表再导入,新建表字段可以重新命名)

    总的来说,“SQL数据库导入向导”是一个实用的工具,它简化了数据库之间的数据迁移过程,特别是对于需要自定义字段绑定、新建表和重命名字段的场景。通过向导式的用户界面,即使是对SQL不太熟悉的用户也能轻松操作。...

Global site tag (gtag.js) - Google Analytics