MySQL JDBC驱动程序中的客户端仿真准备语句

时间:2014-03-19 10:31:50

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

我试图了解MySQL JDBC驱动程序中客户端仿真准备语句的工作原理。

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

  1. 解析传入的SQL查询
  2. 编译SQL查询
  3. 规划/优化数据采集路径
  4. 执行优化查询/获取并返回数据
  5. 步骤的预执行编译SQL语句,因此提供预优化。 对于服务器端预处理语句,将对数据库进行额外的往返以预编译SQL语句。

    问题 如果客户端仿真准备语句不进行数据库往返,它如何执行步骤3?或者客户端仿真准备语句的工作方式不同吗?

    第2部分 我也做过两次实验。

    1. 实验1 - 为每个使用一个客户端准备好的声明 查询
    2. 实验2 - '重用'客户端准备好的语句 多次同一查询
    3. 两个实验都显示出性能方面的改善,例如响应时间。实验1的改进率约为18%,实验2的改进率约为30%。

      问题

      1. 我是否正确地认为预优化仍然存在 客户端准备好的声明?
      2. 如果是,它是否以与服务器端类似的方式预优化 (第1部分中提到的四个步骤)准备陈述或在a 不同的方式?
      3. 如果不是,为什么还有改进?
      4. 感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

简单回答:事实并非如此。 MySQL驱动程序 - 默认情况下 - 将只执行从参数化查询和(转义)参数值创建的查询字符串。它将在本地创建此查询,方法是将参数占位符替换为转义值,然后将其发送到服务器

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

另请注意,MySQL确实有服务器端预处理语句,但您需要使用值为useServerPrepStmts的连接属性true显式启用它。