Java MySQL JDBC驱动程序中的客户端仿真准备语句
我试图理解MySQL JDBC驱动程序中的客户端模拟准备语句是如何工作的 第1部分 我在网上看到,对于准备好的语句,当关系数据库处理JDBC/SQL查询时,有四个步骤,如下所示: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不要求服务器端实际准备
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,你帮了大忙!:)