我最近开始在 Web 应用程序中再次使用准备好的语句,并且我知道不鼓励对所有事务使用准备好的语句。我不知道什么时候最好使用准备好的语句。
我读过何时使用和不使用它们,但没有一个示例真正说明了使用它们的最佳实践。
我试图弄清楚哪些数据库调用我应该使用它们,哪些数据库调用我不应该使用它们。
例如,MySQL 网站在下一页的“何时使用准备好的语句”中提到了它准备语句-MySQL http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html
决定是否使用PreparedStatement 的一般经验法则是:
使用准备好的语句,除非您
有充分的理由不这样做。
编译准备好的语句
在执行之前因此借给
更好的性能,并增加
防止 SQL 注入的安全性
数据库服务器负责
特殊字符的编码。
根据您引用的文章,我认为准备语句不如普通查询或存储过程有用的原因列表如下:
-
一次性查询。如果您的应用程序对数据库进行单个查询,并且与其他查询相比,这种查询很少执行,那么在这种情况下使用准备好的语句可能没有意义。其基本原理是,必须首先编译准备好的语句,并且缓存该语句的“编译”形式以供以后使用。对于不经常运行的查询,编译是一种开销。但仍然最好使用准备好的语句,以避免任何 SQL 注入问题。
-
数据密集型操作。有时,准备好的语句不如存储过程有效,特别是当需要在同一事务中执行一系列操作时。当您的业务流程需要对各种表执行多次选择、更新和删除时,存储过程通常比一堆相继执行的准备好的语句要好。这种性能损失可能会变得严重,因为执行多个语句需要多次网络访问,而调用存储过程时这种性能损失会大大减少。这种效果在查询批处理中更为明显,其中在短时间内创建和销毁多个对象。这通常是数据库管理员和应用程序开发人员之间有争议的问题,因为这是一种边缘情况; DBA 会认为,通过 SP 更好地执行批处理操作,而应用程序开发人员则认为,PreparedStatements 可以处理它(通常最好将所有逻辑放在一层中)。最终归结为应用程序是否有使用 SP 的优势。
-
支持本机数据库操作和类型。。这可能不适用于 MySQL,但一般来说 JDBC 标准并不支持数据库支持的所有操作,以及数据库支持的所有 SQL/本机/自定义类型。这在 Oracle 数据库(可能还有 IBM DB2?)中更为明显,程序员可以在其中创建自己的类型,这需要编写自定义 Java 代码,因为 JDBC 标准不支持数据库中的用户定义类型。类似地,数据库中的其他操作也不需要支持(如 MySQL 文档所述)——无法使用准备语句创建用户(执行 CREATE USER)、修改用户权限(执行 GRANT 操作)等。存储过程更适合此任务,因为它们可以直接或间接方式访问数据库的本机操作集。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)