PreparedStatements的最佳实践; 何时何时不去

The*_*boy 2 java mysql prepared-statement

我最近已经开始在Web应用程序中再次使用预准备语句,并且我知道不鼓励对所有事务使用预准备语句.我不知道的是什么时候最好使用准备好的陈述.

我已经阅读了何时使用而不使用它们,但没有一个例子真正说明了使用它们的最佳实践.

我试图弄清楚我应该使用哪些数据库调用以及哪些不应该使用.

例如,MySQL网站在下一页的"何时使用准备语句"中提到它准备语句-MySQL

Vin*_*lds 6

决定是否参加PreparedStatement的一般拇指规则是:

使用准备好的陈述,除非您有充分的理由不这样做.准备好的语句在执行之前编译,因此可以提高性能,并提高SQL注入的安全性,因为数据库服务器负责特殊字符的编码.

按照您引用的文章,我认为准备语句比普通查询或存储过程更有用的原因列表如下:

  • 一次性查询.如果您的应用程序向数据库发出单个查询,并且与其他查询相比,这种查询很少进行,则在这种情况下使用Prepared Statement可能没有意义.其基本原理是必须首先编译Prepared Statement,并缓存该语句的"编译"形式以供以后使用.对于不经常运行的查询,编译是一种开销.但是,最好使用预准备语句,以避免任何SQL注入问题.
  • 数据密集型操作.有时准备语句不如存储过程有效,特别是当需要在同一事务中执行一系列操作时.当您的业务流程需要对各种表执行多个选择,更新和删除时,存储过程通常比一堆一个接一个地执行的准备语句更好.由于为多个语句的执行进行了多次网络跳闸,因此在调用存储过程时大大减少了这种性能损失.这种效果在查询批处理中更为明显,其中在短时间内创建并销毁了多个对象.这往往是数据库管理员和应用程序开发人员之间的一个有争议的问题,因为这是一个边缘情况; DBA将相信通过SP更好地执行操作批处理,而应用程序开发人员认为PreparedStatements可以处理它(通常更好地将所有逻辑放在一个层中).它最终归结为关于使用SP是否有利的应用程序.
  • 支持本机数据库操作和类型..这可能不是把握好为MySQL,但在一般的JDBC标准不支持由数据库所支持的所有操作,并通过该数据库支持的所有SQL /本地/自定义类型.这是更加明显的Oracle数据库(也可能是IBM DB2?),其中程序员可以创建自己的类型,需要自定义的Java代码写成JDBC标准不支持用户定义类型在数据库中.同样,数据库中的其他操作都需要不支持(如MySQL的文件状态) - 一个不能创造用户(执行CREATE USER),修改用户权限(GRANT进行操作)等使用准备好的语句.存储过程是更适合这个任务,因为他们将有机会获得设置数据库的本地操作,无论是直接或间接的方式.