当前位置:编程学习 > JAVA >>

关于PreparedStatement的问题

引用
PreparedStatement其实是相当于预处理,它会把语句进行分析后保存到缓存块中,下次再执行该语句时就会快,适用于循环调用同一语句时.


这里所说的“缓存块”是在数据库里面还是在执行SQL语句的应用程序中?
如果是在数据库中,是否相当于创建了一个“临时”的存储过程? --------------------编程问答-------------------- 应该是在数据库中 --------------------编程问答-------------------- 不是在数据库中,因为sql语句还没有执行. --------------------编程问答-------------------- JAVA API中有这样一句话

SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句

从这句话来看,应该是在应用程序所使用的PreparedStatement对象中 --------------------编程问答-------------------- 执行后,数据库也会将 SQL 语句缓存起来,下次再是同样 SQL 语句的话,就不需要再进行语法解析,直接拿缓存中的来使用。 --------------------编程问答-------------------- http://www.cnblogs.com/fly_zj/archive/2012/05/11/2496296.html
最近也在关注这个问题

这个要理解sql的执行过程
sql首先语法语义的解析,没有错误的情况下,再进行编译,生成执行计划,然后执行,最后返回结果

对于动态的sql,
说白了,就是拼接字符串形成的sql 
比如:select * from tableName where id='"+this.txtId.text+"'
语法语易做图析通过,编译后,缓存的执行计划重用的机会是很小的,因为txtId.text每次都是变化的

假如是PreparedStatement 绑定变量的方式生成的sql,执行计划是可以重用的

至于原因,数据库在编译sql的时候,实际上是根据sql字符串生成hash值
拼接sql的话,
第一次是
select * from tableName where id=1
第二次很可能是
select * from tableName where id=2

数据库会认为是两个不同的sql

假如是绑定变量的话,

select * from tableName where id=:id(sqlserver 是select * from tableName where id =?id)
解析出来就是同一个执行计划,所以就可以重用

这个事数据库的机制,跟编程语言关系不是太大

--------------------编程问答-------------------- 这个我解释的很粗,
里面有很多很多的细节,具体数据库之间也有一定的差别,有兴趣可以查阅相关资料
其实经常说的绑定变量方式的优点,除了防止sql注入,缓存计划的重用,对于效率的提高,才是重点 --------------------编程问答-------------------- 目标并不是性能,而是编程中的可用性。所以在哪个地方缓存的,也可以不去管它。
例如可以先写sql语句,再赋值。可以重复赋值执行。这样的话就可以按照事务逻辑编写程序,否则没法这么做。
例如防止sql注入不用额外检查了。 --------------------编程问答-------------------- 在数据库侧、程序侧都会有作用。
一能提高性能,二能防止SQL注入。
补充:Java ,  Java SE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,