Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MySQL JDBC驱动程序中的客户端仿真准备语句_Java_Mysql_Jdbc_Prepared Statement_Connector J - Fatal编程技术网

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

Java MySQL JDBC驱动程序中的客户端仿真准备语句,java,mysql,jdbc,prepared-statement,connector-j,Java,Mysql,Jdbc,Prepared Statement,Connector J,我试图理解MySQL JDBC驱动程序中的客户端模拟准备语句是如何工作的 第1部分 我在网上看到,对于准备好的语句,当关系数据库处理JDBC/SQL查询时,有四个步骤,如下所示: 解析传入的SQL查询 编译SQL查询 规划/优化数据采集路径 执行优化的查询/获取和返回数据 步骤的预执行编译SQL语句,从而提供预优化。 对于服务器端准备的语句,将对数据库进行额外的往返以预编译SQL语句 问题 如果客户端仿真准备语句没有往返到数据库,它如何执行步骤3?或者客户端模拟准备语句的工作方式是否不同 第二部

我试图理解MySQL JDBC驱动程序中的客户端模拟准备语句是如何工作的

第1部分 我在网上看到,对于准备好的语句,当关系数据库处理JDBC/SQL查询时,有四个步骤,如下所示:

  • 解析传入的SQL查询
  • 编译SQL查询
  • 规划/优化数据采集路径
  • 执行优化的查询/获取和返回数据
  • 步骤的预执行编译SQL语句,从而提供预优化。 对于服务器端准备的语句,将对数据库进行额外的往返以预编译SQL语句

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

    第二部分 我还做了两个实验

  • 实验1-为每个应用程序使用一个客户端准备的语句 质疑
  • 实验2-“重用”客户端为 同一查询多次
  • 两个实验都显示了响应时间等性能的改善。实验1提高了约18%,实验2提高了约30%

    问题

  • 我是否正确地认为,对于每个人来说,预优化仍然存在 客户方准备的声明
  • 如果是,它是否以类似于服务器端的方式进行了预优化 (第1部分中提到的四个步骤)编制报表或 有什么不同
  • 如果没有,为什么仍有改进

  • 谢谢你的帮助

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

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


    还要注意,MySQL确实有服务器端准备的语句,但是您需要使用连接属性
    useServerPrepsMTS
    和值
    true

    Hi Mark显式启用它,谢谢您的回答。对于您的回答,我想寻求一些澄清:(Q1)这是否意味着对于客户端准备的语句,只有步骤1——“解析传入的SQL查询”发生在客户端?(Q2)步骤2、3和4将发生在服务器端?(Q3)步骤2——“编译SQL查询”是否可能发生在客户端?谢谢它执行1“解析查询”,2“用转义值替换参数”和3“将步骤2中创建的查询发送到服务器”。使用客户端准备语句时,没有特殊的优化步骤。唯一的优化(如果有的话)和编译是当服务器收到最终语句时,就像它在执行普通语句时一样。嗨,马克,这是另一个支持你解释的源代码-谢谢你的回答!!据我所知,您错误地认为MySQL Connector/J中客户端准备的语句具有性能优势。您是否实际使用正常的
    语句测试了第2部分?您观察到的性能优势很可能来自缓存。嗨,马克,我也用一个普通语句测试了第2部分。正常状态是我实验的基线。事实上,我还用服务器端准备的语句进行了另外两个实验。如果重用服务器端准备好的语句,与普通语句相比,性能会有所提高。如果不重用服务器端准备好的语句,则性能会比正常语句有所下降。对于服务器端,这是一个假设,因为必须对数据库进行额外的往返。我刚刚检查了cached preparedstatements的默认设置,Connector/J的默认设置为false。谢谢mark,你帮了大忙!:)