关于PreparedStatement你知道多少
2015-05-14 00:38
232 查看
转载:点击打开链接
推荐:点击打开链接
序言
对应PreparedStatement相信大家都很熟悉,那么为什么要用PreparedStatement呢?也许你会回答PreparedStatement为预处理语句,可以提高数据库执行效率。也许还会回答用PreparedStatement可以防止SQL注入。那么再问下,你觉得你对PreparedStatement有足够的了解吗,你在项目中PreparedStatement用对了吗?
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执行代码:
[java] view
plaincopyprint?
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。
[java] view
plaincopyprint?
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进行检索。
其实不用紧张,告诉大家个好消息,J2EE服务器的连接池管理器已经实现了缓存的使用。J2EE服务器保持着连接池中每一个连接准备过的prepared statement列表。当我们在一个连接上调用preparedStatement时,应用服务器会检查这个statement是否曾经准备过。如果是,这个PreparedStatement会被返回给应用程序。如果否,调用会被转给JDBC驱动程序,然后将新生成的statement对象存入连接缓存。
如果项目未使用数据库连接池怎么办呢,这里只能告诉你,原理你已经很清楚了,自己实现吧。
推荐:点击打开链接
序言
对应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执行代码:
[java] view
plaincopyprint?
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。
[java] view
plaincopyprint?
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对象存入连接缓存。
如果项目未使用数据库连接池怎么办呢,这里只能告诉你,原理你已经很清楚了,自己实现吧。
相关文章推荐
- 关于五险一金,你知道多少?整理点有用的,顺道发上来分享下
- 【汽车进口税】 关于汽车进口税计算你知道多少-汽车保险资讯-阳光车险官方网站
- SEO基础问题:12.关于外链你知道多少?
- 关于符号扩展多少你自己知道
- 关于PHP Notice: A non well formed numeric value encountered, 你知道多少
- 关于视频格式转换器你知道多少
- 关于#define你知道多少?
- 关于符号位扩展你又知道多少
- 关于free如何知道要释放多少内存空间长度的问题
- 关于UITableView,你知道多少
- 【专题】关于敏捷测试,我们到底知道多少?
- 关于Java String,你知道多少?
- 关于脚 ,你知道多少
- 【专题】关于敏捷测试,我们到底知道多少?
- 关于端口号你知道多少!
- 你知道多少关于sql select top N?
- 关于淘宝取名的一些技巧和要点,你知道多少呢?
- 关于Math.round,你知道多少?
- SEO基础问题:1. 关于网站的三要素你知道多少?
- Fiddler工具:关于数据修改,你知道多少?!