我试图了解MySQL JDBC驱动程序中的客户端仿真准备语句如何工作.
第1部分
我在线阅读了有关准备好的语句的信息,当关系数据库处理JDBC / SQL查询时涉及四个步骤,它们分别如下:
>解析传入的SQL查询
>编译SQL查询
>计划/优化数据采集路径
>执行优化的查询/获取并返回数据
步骤的预执行将编译SQL语句,因此提供了预优化.
对于服务器端准备好的语句,将对数据库进行一次额外的往返操作以预编译SQL语句.
题
如果客户端仿真准备好的语句没有往返数据库,该如何执行步骤3?还是客户端仿真准备好的语句工作不同?
第2部分
我也做了两个实验.
>实验1-对每个客户端使用一个客户端准备好的语句
询问
>实验2-为“重新使用”客户端准备好的语句
多次相同的查询
这两个实验都显示出性能的改善,例如响应时间.实验1的改进约18%,实验2的改进约30%.
题
>我是否可以假设仍存在针对
客户端准备好的语句?
>如果是,是否以类似于服务器端的方式进行预优化
(第1部分中提到的四个步骤)准备好的语句或
有很多不同的方式吗?
>如果没有,为什么还有改进?
谢谢你的帮助!
解决方法:
简单答案:否. MySQL驱动程序(默认情况下)将仅执行从参数化查询和(转义的)参数值创建的查询字符串.它将通过用转义的值替换参数占位符在本地创建此查询,然后将其发送到服务器
请注意,JDBC不需要在服务器端实际准备PreparedStatement,也不需要“提高”性能. JDBC仅要求它们可以工作;如:您可以使用?指定查询作为参数占位符,驱动程序将使用通过setXXX方法设置的值正确执行语句.
还要注意,MySQL确实具有服务器端准备好的语句,但是您需要使用连接属性useServerPrepStmts并将其值为true来显式启用它.
标签:jdbc,prepared-statement,java,mysql,connector-j
来源: https://codeday.me/bug/20191122/2055897.html