- 浏览: 102727 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (99)
- 经济 (1)
- dwr (2)
- 测试 (0)
- java (29)
- resin (1)
- oracle (3)
- 感悟 (1)
- jvm (15)
- mina2 (5)
- j2se (12)
- linux (28)
- protobuf (1)
- tcp/ip (0)
- jdbc (0)
- 数据库 (4)
- 游戏 (0)
- 技术文档 (1)
- nosql (2)
- 算法 (2)
- apache (2)
- mysql (1)
- hashcode (1)
- spring (2)
- quartz (5)
- netcat (2)
- 分页 (1)
- 正则 (0)
- shell (1)
- lsof (1)
- nginx (1)
- git (1)
最新评论
-
fys124974704:
你试下将第三条写成以下这样,你会发现你的结论不对:select ...
ORACLE分页SQL语句 -
ikon:
两个乘数没有转成integer,而是当成字符串;BigInte ...
计算任意2个正整数的乘积 -
kidding87:
效率不是很高,思路没有问题,但是你的两个乘数输入都都转为Int ...
计算任意2个正整数的乘积 -
k1280000:
------------------------同意!
学习之道
一、我们先来看一下sql的执行过程:
在Oracle里执行一个SQL语句,一般都要经过下面几个步骤:
Create a Cursor 创建游标;
Parse the Statement 解析语句;
Bind Any Variables 绑定变量;
Run the Statement 运行语句;
Close the Cursor 关闭游标;
如果是一个查询SQL,则还要经过下面的步骤:
Describe Results of a Query 描述查询的结果集;
Define Output of a Query 定义查询的输出数据;
Fetch Rows of a Query 获取查询出来的行。
二、SQL解析过程
从上面的步骤可以看出,每执行一个SQL,都需要对它进行解析(Parse),而一个解析过程,需要完成下面的工作:
语法检查,验证它是否是合法的语句,有没有语法错误;
语义检查,实现数据字典的查找,以验证是否符合表和列的定义,类型是否正确;
(如果是CBO优化模式,关于CBO,请看后面Oracle的优化器一章)收集参考对象的统计;
在所要求的对象上获取语法分析锁,使得在语句的语法分析过程中不改变这些对象的定义;
检查用户的权限是否足够;
从许多可能的执行路径中选择此语句最佳的执行计划;
将它装入共享SQL区;
生成语句的编译版本(P-CODE)。
解析是一个昂贵的操作,因为解析过程中需要消耗许多资源,而且费时,正因为如此,Oracle创造了共享池的概念,共享池会自动将解析过的SQL缓存起来,以后碰到相同的SQL,就不用再解析了,这样可以大大提高SQL的执行速度。
三、 缓存SQL的原理
ORACLE执行SQL语句时,先将SQL语句的字串通过一个hash算法得出一个hash值,然后检查共享池中是否已存在这个哈希值,若有就用已缓存的执行计划来执行这个语句(即缓存命中,后面我们会提到共享池的命中率,就是这个概念),若没有(即缓存缺失)则需进行解析。
由于Oracle是通过SQL字符的hash值来判断是否为相同的SQL语句,因此,如果你的SQL有一点小小的变换,在Oracle看来,就是另外一个SQL了,会对它进行重新解析。
例如:
- select id, name from members where id = 1403
- select id, name From members where id = 1403
- select name, id from members where id = 1403
这三条SQL在Oracle看来就是三条不同的SQL。
绑定变量
在大部分时候,sql语句里有一些经常会变化的值。例如:
- select id, name from members where id = 1207
- select id, name from members where id = 1208
- select id, name from members where id = 1209
前面说过了,这样的SQL其实是三条不同的SQL,因为它们的字符明显不一样。那我们该怎么样才能让它们成为同一条SQL呢?可以通过绑定变量来实现。
下面是一条含绑定变量的sql 语句:
- select id, name from members where id = :member_id
这样不管member_id如何变化,Oracle都会认为这条SQL是同一条,就可以节省解析的成本了。
那么,在java开发中,怎么使用绑定变量呢?注意,不要认为下面的代码是在使用绑定变量:
- Statement stmt=conn.createStatement();
- String member_id=member.id;
- String sql="select id,name from members where id ="+member_id;
- stmt.executeQuery(sql);
上面的例子里,当member.id的值为1207时,我们传给stmt的SQL实际上是:
- select id, name from members where id = 1207
当member.id的值为1208时,就是:
- select id, name from members where id = 1208
它们在Oracle看来仍然是不同的SQL。
其实,在java中使用绑定变量非常简单,只需要使用PreparedStatement对象就可以了。如下:
- String sql="select id,name from members where id =?";
- PreparedStatement pstmt=conn.createStatement(sql);
- pstmt.setString(1,member.id);//将member.id传给第一个问号。
这样,PreparedStatement会自动把这条SQL在传给Oracle时转化为类似下面的SQL:
- select id, name from members where id = :member_id
这样就实现了绑定变量,它只需解析一次,不管member.id如何变化,都不用再做解析了。
发表评论
-
Quartz定时任务学习(一)简单任务
2012-04-27 12:30 843学习quartz首先了解三个概念: 调度器:负责调度作 ... -
介绍Quartz
2012-04-27 12:22 1413介绍Quartz Quartz是一个开源的任务调度 ... -
理解Quartz触发器(1)
2012-04-27 11:37 867Quartz中一个Job往往是 ... -
Quartz中SimpleTrigger的探讨
2012-04-27 11:34 7061.来写一个每隔10秒启动一次任务的例子. import j ... -
理解Java对象序列化
2012-02-15 09:38 697关于Java序列化的文章早 ... -
认识Arrays(一)打印
2012-02-03 16:52 573Arrays提供了一组操作array的静态方法。 一、基本类 ... -
oracle java数据类型对应表
2011-12-05 13:37 0[img]http://dl.iteye.com/upload ... -
计算任意2个正整数的乘积
2011-11-12 21:36 1209接上一篇整数的阶乘算法,来计算2个正整数的乘积; 算法如下: ... -
计算任意正整数的阶乘
2011-11-12 20:17 668由于阶乘的结果会超出java数据类型的最大范围,所 ... -
Java调用外部程序技巧
2011-11-08 09:17 799前些天使用Java调用外部程序的时候,发现线程会堵塞在wa ... -
多核平台下的JAVA优化
2011-11-08 09:12 633现在多核CPU是主流。利用多核技术,可以有效发挥硬件的能力 ... -
使用 Eclipse Memory Analyzer 进行堆转储文件分析
2011-11-07 17:09 773http://www.ibm.com/developerwor ... -
infoQ 文档ppt
2011-11-07 11:43 1253http://www.docin.com/app/user/c ... -
游戏性能监控
2011-11-07 10:18 01、cpu消耗(耗时)监控 在功能代码前后取时间值,相减,发 ... -
使用Cacti监控你的网络(一)- Cacti概述及工作流程
2011-11-07 09:36 678http://blog.sina.com.cn/s/b ... -
浅析 Java Thread.join()
2011-10-29 09:25 862一、在研究join的用法之前,先明确两件事情。 1.join ... -
hashmap线程不安全在哪里?
2011-10-13 11:33 1078大家都知道HashMap不是线程安全的,但是大家的理解 ... -
java面试题及答案(基础题122道,代码题19道)
2011-10-10 22:54 655http://ilovelate.itpub.net/post ... -
关于UnsupportedOperationException异常
2011-09-29 12:03 571我们在使用collection框 ... -
关注一下druid
2011-09-26 09:21 700关注一下druid,阿里开源的jdbc组件,可以监控数据库访问 ...
相关推荐
PreparedStatement 预编译statement 的详细介绍java视频 马克java社区 马克-to-win
Java之JDBC连接数据库实现增删改查(2018 使用Dao层实现 完美封装解决硬编码问题 使用预编译对象PreparedStatement) 配置文件 db.properties(保存数据库账号和密码等) 工具类 JDBCUtil.java(抽取公共部分,解决硬...
- PreparedStatement预编译的SQL执行对象 1. 可以避免SQL注入 因为在编译的时候已经把SQL的逻辑固定,不会因为替换进去的内容改变逻辑 2. 如果SQL中涉及变量 相比Statement的字符串拼接的方式,代码可读性提高,并且...
6.1 PreparedStatement预编译对象 6.2 CallableStatement存储过程对象 6.3 BatchedUpdate对象 6.4 Rowset行集合对象 6.5 JDBC的事务 6.6 本章小结 第7章 JDBC结合Servlet与JSP 的应用 7.1 Servlet概述...
SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句
大家平时都使用过JDBC中的PreparedStatement接口,它有预编译功能。什么是预编译功能呢?它有什么好处呢? 当客户发送一条SQL语句给服务器后,服务器总是需要校验SQL语句的语法格式是否正确,然后把SQL语句编译...
NULL 博文链接:https://chaoyi.iteye.com/blog/2088080
内容为JDBC增删改查 ,事物处理, 批处理,以及预编译示例代码
PrepatredStatement实例包含已编译的SQL语句,由于PreparedStatement对象已预编译过哦哦,所以执行速度快于Statement对象。 包含于PreparedStatement对象中的SQL语句具有一个或多个IN参数。IN参数的值在SQL...
PreparedStatement接口继承Statement,并与之在两方面有所不同: PreparedStatement 实例包含已编译...由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象。因此,多次执行的 SQL 语句经常创
PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程,下面这篇文章主要给大家介绍了关于利用JDBC的PrepareStatement打印真实SQL的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
通过使用预编译语句(例如,在Java中使用PreparedStatement),可以确保用户输入被当作参数处理,而不是SQL语句的一部分。 2. 检验和清洗用户输入 对用户输入进行验证,确保它符合预期的格式。例如,如果你期待一个...
1)性能方面,PreparedStatement有预编译过程,一旦绑定SQL语句就可以执行多次,Statement执行多少次就要编译多少次SQL语句。PreparedStatement用来执行动态的SQL语句,即包含参数的SQL语句,而Statement用
这次写的还是对单表的增 删 改 查 ,与version1.0版本不同的是PreparedStatement 接口,它是预编译的Sql语句对象,与 Statement 不同的是 PreparedStatement ...
实现类 UserDaoImpl.java(实现增删改查功能 使用预编译对象PreparedStatement 安全、便捷不需要我们去拼接字符串,特别是字段很多的时候 同时效率比Statement更高 ) 测试类 UserDaoTest.java(做测试增删改查功能...
每一个知识点的讲解,都会包含语法,语法个数如何定义,然后语法下面就是使用方式,能够起到活学活用的帮助,比如在讲解jdbc的时候我会列举出来 Statement(执行简单的sql语句,不支持预编译) PreparedStatement...
在上一篇文章我们讲了一些基本使用JDBC-DBCP-MYBATIS。 1.防止SQL注入 我们在写sql语句时,为了方便可能会进行拼接字符串,这样做的...//使用预编译对象进行预编译,就不使用原始的Statement对象 PreparedStatement pr
preparedstatement:叫做预编译的对象,在语句执行之前,向数据库发送类似于公式一样的模板,其中使用了替换变量,从而提高了数据存储的安全性,但这个数据操作对象不是效率最高的。可以应用于绝大多数数据库。 ...
预编译对象 PreparedStatement的CRUD操作 crud是指在做计算处理时的增加(Create)、读取(Retrieve)、更新(Update)和删除(Delete)--六祎大王家贡献
在缓冲区中可以发现预编译的命令,并且可以重新使用。在有大量用户的企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端...