mysql preparedstatement_关于PreparedStatement你知道多少
序言 对应PreparedStatement相信大家都很熟悉,那么为什么要用PreparedStatement呢?也许你会回答PreparedStatement为预处理语句,可以提高数据库执行效率。也许还会回答用PreparedStatement可以防止SQL注入。那么再问下,你觉得你对PreparedStatement有足够
序言
对应PreparedStatement相信大家都很熟悉,那么为什么要用PreparedStatement呢?也许你会回答PreparedStatement为预处理语句,可以提高数据库执行效率。也许还会回答用PreparedStatement可以防止SQL注入。那么再问下,你觉得你对PreparedStatement有足够的了解吗,你在项目中PreparedStatement用对了吗?
原理分析
首先来看下Statement及PreparedStatement执行过程,一个sql语句执行过程中,将经历这么几个步骤:
1、传输SQL给数据库
2、数据库验证并解析SQL
3、计算Access Plan。数据库会通过检测index,statistics来给出最优的访问计划。
4、根据访问计划进行检索,返回数据。
在上面步骤中,第3步是非常耗时的。因此,为了提高性能,数据库会缓存执行语句以及其Access Plan。这被称为statement cache。在statement cache中,sql语句本身为key,access plan为value。当相同的sql语句被发送过来时,数据库会使用缓存中的access plan以节省cpu时间。
下边看下Statement执行代码:
Statement statement = connection.createStatement();
String sql1="Select * from test where id=1";
String sql2="Select * from test where id=";
statement.execute(sql1);
statement.execute(sql1);
statement.execute(sql1);
statement.execute(sql2+"2");
statement.execute(sql2+"3");
sql1在第一次执行的时候,需要计算执行计划。但在第2和3次执行的时候,会使用缓存好的执行计划,因此后面的sql1不会再重新检验语法与计算执行计划,效率会比第一次高。
sql2却每次都在变化,在cache中,key为整个sql语句,所以每次sql2都无法命中cache,即使它仅仅参数不同,也必须重新检验语法与计算执行计划,效率自然就低下。
强大的数据库会在cache命中上做优化,但复杂的语句还是避免不了miss。
PreparedStatement的存在是为了避免sql2的劣势。看下面code。
String sql2="Select * from test where id=?";
PreparedStatement pstmt = connection.prepareStatement(sql2);
pstmt.setInt(1,2);
pstmt.executQuery();
pstmt.setInt(1,3);
pstmt.executQuery();
PreparedStatement在创建的时候,会将参数化的语句发送给数据库,进行语法检测和执行计划计算。Cache中的key将是参数化的语句。当后面preparedstatement在执行的时候,每次均会命中cache,使用已存在的access plan进行检索。
如何正确使用
PreparedStatement的生命周期跟Statement一样,在一个数据库连接connection范围内有效,所以说如果一次连接中对于同一个PreparedStatement处理多次(参数不同),那么用PreparedStatement是可以提高效率,但大多情景都是多次连接中处理同一个PreparedStatement,那么就算使用了PreparedStatement也不能提高效率,比较PreparedStatement的生命周期只在Connection中。那么如何正确的使用PreparedStatement呢?
其实不用紧张,告诉大家个好消息,J2EE服务器的连接池管理器已经实现了缓存的使用。J2EE服务器保持着连接池中每一个连接准备过的prepared statement列表。当我们在一个连接上调用preparedStatement时,应用服务器会检查这个statement是否曾经准备过。如果是,这个PreparedStatement会被返回给应用程序。如果否,调用会被转给JDBC驱动程序,然后将新生成的statement对象存入连接缓存。
如果项目未使用数据库连接池怎么办呢,这里只能告诉你,原理你已经很清楚了,自己实现吧。
本文原创发布php中文网,转载请注明出处,感谢您的尊重!
mysql preparedstatement_关于PreparedStatement你知道多少相关推荐
- 【转】从源码分析PreparedStatement是如何防止SQL注入的?
为什么在Java中PreparedStatement能够有效防止SQL注入?这可能是每个Java程序员思考过的问题. 首先我们来看下直观的现象(注:需要提前打开mysql的SQL文日志) 1. 不使用 ...
- PreparedStatement和Statement比较
在选择使用Statement时,会产生SQL注入: @Testpublic void testSave(){String name = "a' or 1=1 or 1='";Str ...
- mysql jdbc 绑定变量_jdbc测试mysql数据库sql预解析(绑定变量)
jdbc测试mysql数据库sql预解析(绑定变量) 用习惯了oracle,学习mysql,想测试一下mysql绑定变量的效果.以前看网上介绍大部份都说mysql没有sql共享池的概念,所以也不存在s ...
- jdbc mysql 源码_【JDBC系列】从源码角度理解JDBC和Mysql的预编译特性
背景 最近因为工作调整的关系,都在和数据库打交道,增加了许多和JDBC亲密接触的机会,其实我们用的是Mybatis啦.知其然,知其所以然,是我们工程师童鞋们应该追求的事情,能够帮助你更好的理解这个技术 ...
- mysql cst_一次 JDBC 与 MySQL 因 “CST” 时区协商误解导致时间差了 14 或 13 小时的排错经历...
摘要 名为 CST 的时区是一个很混乱的时区,在与 MySQL 协商会话时区时,Java 会误以为是 CST -0500,而非 CST +0800. CST 时区 名为 CST 的时区是一个很混乱的时 ...
- PreparedStatement是如何防止SQL注入的?
为什么在Java中PreparedStatement能够有效防止SQL注入?这可能是每个Java程序员思考过的问题. 首先我们来看下直观的现象(注:需要提前打开mysql的SQL文日志) 1. 不使用 ...
- JDBC批处理插入更新MySQL Oracle
Today we will look into JDBC Batch insert and update examples in MySQL and Oracle databases. Sometim ...
- mysql印度时区_一次 JDBC 与 MySQL 因 “CST” 时区协商误解导致时间差了 14 或 13 小时的排错经历...
CST 时区 名为 CST 的时区是一个很混乱的时区,有四种含义: 美国中部时间 Central Standard Time (USA) UTC-06:00 澳大利亚中部时间 Central Stan ...
- jdbc PreparedStatement中“?”报错
报错场景:用jdbc连接mysql,用PreparedStatement时候报了sql语句的错误. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorEx ...
- 什么是MySQL的预编译?
一.什么是MySQL的预编译? 通常我们发送一条SQL语句给MySQL服务器时,MySQL服务器每次都需要对这条SQL语句进行校验.解析等操作. 但是有很多情况下,我们的一条SQL语句可能需要反复的执 ...
最新文章
- ViewTreeObserver视图树观察者
- Python丢弃返回值
- TP查看已部署的TP框架的版本
- 阿里巴巴商城源码JAVA_阿里巴巴Dubbo实现的源码分析
- 一步步编写操作系统 69 汇编语言和c语言共同协作 70
- 直播预告 | 乘云而上:云原生数据仓库AnalyticDB
- 半导体八大工艺流程图_半导体之光刻胶,看五大龙头谁能迈出国产化第一步?...
- 可视化操作和命令化操作
- python爬取方式_Python3 实现爬取网站下所有URL方式
- GWR(地理加权回归)预测分析中国各省份开关窗情况(R语言)
- 网吧十大漏洞曝光(转)
- Markdown工具之Typora--画思维导图
- 分布式电商项目十七:商品服务-三级分类和查询
- html5方框的箭头怎么弄,纯CSS-带箭头的DIV方框
- iPhoneX的启动图如何配置
- shell判断大于、小于、等于
- Tiled结合Unity做地图——Tiled2Unity
- 【c++】factory的使用:create和destory,以cicadaplayer的render实现为例
- 2019HDU多校第一场1001 BLANK (DP)(HDU6578)
- 【Kafka】测试集群中Broker故障对客户端的影响