序言 对应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你知道多少相关推荐

  1. 【转】从源码分析PreparedStatement是如何防止SQL注入的?

    为什么在Java中PreparedStatement能够有效防止SQL注入?这可能是每个Java程序员思考过的问题. 首先我们来看下直观的现象(注:需要提前打开mysql的SQL文日志) 1. 不使用 ...

  2. PreparedStatement和Statement比较

    在选择使用Statement时,会产生SQL注入: @Testpublic void testSave(){String name = "a' or 1=1 or 1='";Str ...

  3. mysql jdbc 绑定变量_jdbc测试mysql数据库sql预解析(绑定变量)

    jdbc测试mysql数据库sql预解析(绑定变量) 用习惯了oracle,学习mysql,想测试一下mysql绑定变量的效果.以前看网上介绍大部份都说mysql没有sql共享池的概念,所以也不存在s ...

  4. jdbc mysql 源码_【JDBC系列】从源码角度理解JDBC和Mysql的预编译特性

    背景 最近因为工作调整的关系,都在和数据库打交道,增加了许多和JDBC亲密接触的机会,其实我们用的是Mybatis啦.知其然,知其所以然,是我们工程师童鞋们应该追求的事情,能够帮助你更好的理解这个技术 ...

  5. mysql cst_一次 JDBC 与 MySQL 因 “CST” 时区协商误解导致时间差了 14 或 13 小时的排错经历...

    摘要 名为 CST 的时区是一个很混乱的时区,在与 MySQL 协商会话时区时,Java 会误以为是 CST -0500,而非 CST +0800. CST 时区 名为 CST 的时区是一个很混乱的时 ...

  6. PreparedStatement是如何防止SQL注入的?

    为什么在Java中PreparedStatement能够有效防止SQL注入?这可能是每个Java程序员思考过的问题. 首先我们来看下直观的现象(注:需要提前打开mysql的SQL文日志) 1. 不使用 ...

  7. JDBC批处理插入更新MySQL Oracle

    Today we will look into JDBC Batch insert and update examples in MySQL and Oracle databases. Sometim ...

  8. mysql印度时区_一次 JDBC 与 MySQL 因 “CST” 时区协商误解导致时间差了 14 或 13 小时的排错经历...

    CST 时区 名为 CST 的时区是一个很混乱的时区,有四种含义: 美国中部时间 Central Standard Time (USA) UTC-06:00 澳大利亚中部时间 Central Stan ...

  9. jdbc PreparedStatement中“?”报错

    报错场景:用jdbc连接mysql,用PreparedStatement时候报了sql语句的错误. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorEx ...

  10. 什么是MySQL的预编译?

    一.什么是MySQL的预编译? 通常我们发送一条SQL语句给MySQL服务器时,MySQL服务器每次都需要对这条SQL语句进行校验.解析等操作. 但是有很多情况下,我们的一条SQL语句可能需要反复的执 ...

最新文章

  1. ViewTreeObserver视图树观察者
  2. Python丢弃返回值
  3. TP查看已部署的TP框架的版本
  4. 阿里巴巴商城源码JAVA_阿里巴巴Dubbo实现的源码分析
  5. 一步步编写操作系统 69 汇编语言和c语言共同协作 70
  6. 直播预告 | 乘云而上:云原生数据仓库AnalyticDB
  7. 半导体八大工艺流程图_半导体之光刻胶,看五大龙头谁能迈出国产化第一步?...
  8. 可视化操作和命令化操作
  9. python爬取方式_Python3 实现爬取网站下所有URL方式
  10. GWR(地理加权回归)预测分析中国各省份开关窗情况(R语言)
  11. 网吧十大漏洞曝光(转)
  12. Markdown工具之Typora--画思维导图
  13. 分布式电商项目十七:商品服务-三级分类和查询
  14. html5方框的箭头怎么弄,纯CSS-带箭头的DIV方框
  15. iPhoneX的启动图如何配置
  16. shell判断大于、小于、等于
  17. Tiled结合Unity做地图——Tiled2Unity
  18. 【c++】factory的使用:create和destory,以cicadaplayer的render实现为例
  19. 2019HDU多校第一场1001 BLANK (DP)(HDU6578)
  20. 【Kafka】测试集群中Broker故障对客户端的影响

热门文章

  1. 临床试验中的样本量估算---实践篇
  2. 5.4、聚类之EM聚类实例
  3. 什么是QCIF? CIF?2CIF?4CIF?DCIF?
  4. 计算机网络教程第五版|微课版 - 相关微课视频
  5. 【计算机网络】实验报告三:Cisco Packet Tracer 实验
  6. bc547可以用8050代换吗_代换S8550 S8050三极管要特别注意放大倍数
  7. 操作系统原理:文件系统
  8. 联想V470C 禁用触摸板
  9. git文件没有绿色红色小图标
  10. 计算机辅助设计与制造考试重点,2016计算机辅助设计与制造复习内容