【问题标题】:Client-side emulation prepared statement in MySQL JDBC driverMySQL JDBC驱动程序中的客户端模拟准备语句
【发布时间】:2014-04-25 12:37:53
【问题描述】:

我正在尝试了解 MySQL JDBC 驱动程序中的客户端模拟准备语句是如何工作的。

第 1 部分 我在网上读到,对于prepared statements,关系数据库处理JDBC/SQL查询时涉及四个步骤,它们如下:

  1. 解析传入的 SQL 查询
  2. 编译 SQL 查询
  3. 规划/优化数据采集路径
  4. 执行优化查询/获取并返回数据

步骤的预执行编译 SQL 语句并因此提供预优化。 对于服务器端准备好的语句,将对数据库进行额外的往返以预编译 SQL 语句。

问题 如果客户端模拟准备好的语句不往返数据库,它如何执行第 3 步?还是客户端模拟准备好的语句的工作方式不同?

第 2 部分 我也做了两个实验。

  1. 实验 1 - 对每个使用一个客户端准备好的语句 查询
  2. 实验 2 - 为 多次相同的查询

两个实验都显示响应时间等性能有所改善。实验 1 提高了 18% 左右,实验 2 提高了 30% 左右。

问题

  1. 我是否正确假设预优化仍然存在 客户端准备好的语句?
  2. 如果是,是否以类似于服务器端的方式进行预优化 (第 1 部分中提到的四个步骤)准备好的语句或在 有什么不同?
  3. 如果没有,为什么还有改进?

感谢您的帮助!

【问题讨论】:

  • 据我所知,您有一个错误的假设,即 MySQL Connector/J 中的客户端准备语句具有性能优势。你真的用普通的Statement 测试过你的第 2 部分吗?您观察到的性能优势很可能源于缓存。
  • 嗨,马克,我也用正常的语句测试了第 2 部分。正常的陈述是我实验的基线。事实上,我还用服务器端准备好的语句进行了另外两个实验。如果我重用服务器端准备好的语句,与普通语句相比,性能会有所提高。如果我不重用服务器端准备好的语句,与普通语句相比,性能会下降。对于服务器端,它作为假设工作,因为必须对数据库进行额外的往返。
  • 我刚刚检查了缓存preparedstatements的默认设置,对于Connector/J,它设置为false。谢谢马克,你帮了大忙! :)

标签: java mysql jdbc prepared-statement connector-j


【解决方案1】:

简单的答案:没有。 MySQL 驱动程序 - 默认情况下 - 将简单地执行从参数化查询和(转义)参数值创建的查询字符串。它将通过用转义值替换参数占位符在本地创建此查询,然后将其发送到服务器

请注意,JDBC 并不要求 PreparedStatement 实际上是在服务器端准备的,也不要求它“提高”性能。 JDBC 只要求它们工作;如:您可以使用? 指定查询作为参数占位符,驱动程序将使用通过setXXX 方法设置的值正确执行语句。

另请注意,MySQL 确实有服务器端准备好的语句,但您需要使用连接属性 useServerPrepStmts 和值为 true 显式启用此功能。

【讨论】:

  • 嗨,马克,感谢您的回答。针对您的回答,我想寻求一些澄清:(Q1)这是否意味着对于客户端准备好的语句,只有第 1 步-“解析传入的 SQL 查询”发生在客户端? (Q2) Step2、3、4会发生在服务器端吗? (Q3) step2-"Compile the SQL query" 是否可能发生在客户端?谢谢!
  • 它执行 1“解析查询”、2“用转义值替换参数”和 3“将步骤 2 中创建的查询发送到服务器”。使用客户端准备好的语句时没有特殊的优化步骤。唯一的优化(如果有的话)和编译是当服务器接收到最终语句时,就像执行正常语句时一样。
  • 嗨,马克,这是另一个支持你解释的来源 - authorstream.com/Presentation/…
  • 感谢您的回答!!
猜你喜欢
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 2013-07-10
  • 2018-03-14
  • 2013-07-19
相关资源
最近更新 更多