准备好的语句的最佳实践;何时做、何时不做

2024-01-01

我最近开始在 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(使用前将#替换为@)

准备好的语句的最佳实践;何时做、何时不做 的相关文章

随机推荐

  • Get-SPWeb 无法找到具有 ID 或 URL 的对象

    问题 我似乎无法弄清楚为什么会出现下面的错误 即使 SharePoint 网站以及被调用的文档库存在 文档库Lib1有文档 文件夹 文档库Lib2是空的 有人知道出了什么问题吗 ERROR Get SPWeb Cannot find an
  • 如何使用 VBScript 关闭特定文件夹?

    我正在尝试使用 VBScript 制作一个简单的程序 每次打开特定文件夹时都会关闭该文件夹 从而拒绝对该文件夹的访问 我已经成功地在许多文件夹中使用了此代码 但由于某种原因它不适用于C ProgramData Microsoft Windo
  • 尚未注册类型“Microsoft.AspNetCore.Hosting.IHostingEnvironment”的服务

    当我想开火时我遇到了问题add migrationASP MVC Core 2 项目的命令 尚未注册类型 Microsoft AspNetCore Hosting IHostingEnvironment 的服务 这是我的启动 cs publ
  • 如何用BeautifulSoup找到评论标签

    我尝试了 soup find 但它似乎不起作用 提前致谢 编辑 感谢您提供有关如何查找所有评论的提示 我有一个后续问题 具体如何搜索评论 例如 我有以下评论标签 我真的只想要这个东西 i Wednesday 110518 i 110518
  • 如何在 Laravel Auth::attempt 中使用条件参数?

    使用 Laravel 4 1 30 我得到了以下代码 该代码通过身份验证测试登录尝试 more codes here auth Auth attempt array email gt Input get email password gt
  • 为整个应用程序设置Python27 Google AppEngine默认编码

    我想将我的 python27 appengine 站点的默认编码设置为 utf 8 默认为 ascii 有一个类似的问题回答过http code google com p googleappengine issues detail id 5
  • 用于操作系统检测的 PHP 正则表达式

    我使用此代码来检测用户的操作系统
  • 无法创建 AWS-SNS GCM 帐户,显示无效凭证消息

    到目前为止 我一直在寻找有关这个特定问题的资源 但运气不佳 所以我想我会在这里尝试 我正在尝试使用 GCM 在 AWS SNS 控制台中创建 Amazon Web Service 简单通知服务应用程序 我已经毫无问题地创建了 iOS 版本的
  • 当启用 use strict 时,如何找到 JavaScript 中的调用者函数?

    是否可以在以下情况下看到函数的被调用者 调用者use strict已启用 use strict function jamie console info arguments callee caller name this will outpu
  • 为什么 event.getSource() 对于具有相关源视图的辅助功能事件返回 null?

    对于 android widget Button 上的事件 TYPE VIEW CLICKED事件 getSource https developer android com reference android view accessibi
  • 如何验证用户当前的密码?

    所以 也许我在文档中的某个地方错过了这一点 但我找不到类似的东西 我不希望我的用户必须输入当前密码才能创建新密码 据我了解 如果用户经过身份验证 他就可以更新密码而无需提供当前密码 即使这可能有点安全 我宁愿让他输入他的旧密码 以防止人们继
  • 定义计算相关矩阵的协方差矩阵的函数

    我在矩阵转换以及行和列的名称方面遇到一些问题 我的问题如下 作为输入矩阵我有一个 对称 相关矩阵像这个 The 相关向量由下三角矩阵的值给出 现在 我想计算这些相关性的方差 协方差 矩阵 它们近似正态分布方差 协方差 矩阵 The 差异可以
  • MonadBaseControl 的用途是什么?

    我正在深入研究 Yesod 的 monad 并且遇到了MonadBaseControl 我看了一眼 hackage 文档 然后就迷路了 有人可以告诉我它试图解决的问题吗 Michael Snoyman 实际上写了一个关于 monad con
  • 还要注意项目文件

    I use sbt以下列方式 我跑 test compile在 sbt 中工作 然后在 IDE 中工作 偶尔观察项目是否仍然可以编译 因为 IDE 的演示编译器往往有错误 当我git pull一些代码 可能会发生变化project 文件 所
  • 如何使用 RXJS 每 2 分钟进行一次 http 调用?

    我有一项服务每 2 分钟就会呼叫我的休息服务 在我的服务中我有以下功能 getNotifications token string const body xxxxxxxxx token return this http post rest
  • Ruby 数组创建,Array.new 与 []

    这两种说法有什么区别 我在我的 Rails 应用程序中使用它们 对我来说 它们看起来像做同样的事情 array a Array new array b 这两个语句在功能上是相同的 Array new但是可以接受参数和块 Array new
  • 如何利用 Google Firebase 数据库中的过滤器和子元素

    Working on an Android app that is using the new Firebase Database framework It has data objects that are modeled like th
  • 将 WebSocket 与 ASP.NET Web API 结合使用

    在 ASP NET Web API 应用程序中使用原始 Websocket 的首选方法是什么 我们想用binaryASP NET Web API 应用程序的几个接口上的 WebSocket 我很难确定应该如何完成此操作 因为 NET 的在线
  • CouchDB 视图出错

    我一直在使用 CouchDB 和 RelaxDB rub y 库 但创建一个视图然后尝试访问它会导致一个令人讨厌的非特定错误 我退后一步 因为我认为 RelaxDB 可能与我正在使用的 CouchDB 版本 0 8 1 不兼容 但即使我创建
  • 准备好的语句的最佳实践;何时做、何时不做

    我最近开始在 Web 应用程序中再次使用准备好的语句 并且我知道不鼓励对所有事务使用准备好的语句 我不知道什么时候最好使用准备好的语句 我读过何时使用和不使用它们 但没有一个示例真正说明了使用它们的最佳实践 我试图弄清楚哪些数据库调用我应该