当前位置: 首页 > 面试题库 >

MySQL JDBC驱动程序中的cachePrepStmts和useServerPrepStmts有什么区别

万修为
2023-03-14
问题内容

MySQL JDBC驱动程序将这两个属性定义为:

  • useServerPrepStmts-如果服务器支持的话,使用服务器端准备好的语句?

  • cachePrepStmts-
    驱动程序是否应该缓存客户端准备好的语句的PreparedStatements的解析阶段,是否适合服务器端准备好的语句和服务器端准备好的语句本身的“检查”?

客户端准备好的语句是否可以重用PreparedStatements对象?

如果useServerPrepStmts启用,则由于MySQL没有执行计划缓存,因此确切地缓存了什么?


问题答案:

首先,区分客户端和服务器准备好的语句很重要。

客户准备的语句是“模拟”准备的语句。这意味着在客户端将SQL语句字符串标记为令牌,并且在将语句发送到服务器执行之前,所有占位符都将被文字值替换。每次执行时,完整的SQL语句都会发送到服务器。您可以使用常规日志来调查其工作原理。例如

以下代码:

ps=conn.prepareStatement("select ?")
ps.setInt(1, 42)
ps.executeQuery()
ps.setInt(1, 43)
ps.executeQuery()

将显示在日志中:

255 Query  select 42
255 Query  select 43

“查询”表示,在协议级别上,将COM_QUERY发送命令,并在其后添加语句字符串。

服务器准备的语句

服务器准备语句是“
true”准备语句,表示将查询文本发送到服务器,进行解析,然后将占位符和结果信息返回给客户端。这是设置时得到的useServerPrepStmts=true。语句字符串仅一次通过COM_STMT_PREPARE调用发送到服务器(在此处记录)。每次执行都是通过发送COM_STMT_EXECUTE带有准备好的语句句柄和文字值来代替占位符来执行的。

与客户准备好的示例形成对比,我们可以使用类似的代码块(但是这次启用了服务器准备的语句):

ps2=conn2.prepareStatement("select ?")
ps2.setInt(1, 42)
ps2.executeQuery()
ps2.setInt(1, 43)
ps2.executeQuery()

日志将显示:

254 Prepare    select ?
254 Execute    select 42
254 Execute    select 43

您可以看到该语句在执行前已准备好。该日志为我们提供了帮助,并显示了执行的完整语句,但实际上,每次执行时,仅占位符值从客户端发送到服务器。

缓存准备好的语句

许多连接池将在连接的使用之间缓存准备好的语句,这意味着,如果您调用conn.prepareStatement("select ?"),它将PreparedStatement在后续调用中使用相同的语句字符串返回相同的实例。当将连接返回到事务之间的池中时,这有助于避免在服务器上重复准备相同的字符串。

MySQL
JDBC选项cachePrepStmts将以这种方式缓存准备好的语句(客户端和服务器准备好的语句),以及缓存语句的“可准备性”。MySQL中有一些语句无法在服务器端准备。如果驱动程序认为可能,则驱动程序将尝试在服务器上准备一条语句,如果准备失败,则退回给客户端准备的语句。由于需要往返服务器,因此该检查很昂贵。该选项还将缓存此检查的结果。

希望这可以帮助。



 类似资料:
  • 问题内容: 之前我曾假设: 平台驱动程序适用于片上设备。 普通设备驱动程序用于与处理器芯片接口的设备。 在遇到一个i2c驱动程序之前…但是在这里,我正在阅读定义为平台驱动程序的多功能i2c驱动程序。我经历了https://www.kernel.org/doc/Documentation/driver- model/platform.txt 。但是对于如何定义驱动程序(如片上和接口设备),仍然没有一

  • 我不知道Spark驱动程序和应用程序主程序之间有什么区别。基本上是在运行一个应用程序中的职责,谁做什么? 在客户端模式下,客户端机器拥有驱动程序,应用程序主程序运行在集群节点中。在集群模式下,客户端没有任何驱动程序,驱动程序和应用程序主程序运行在同一个节点(集群节点之一)。 参考资料: 火花驱动程序内存和应用程序主内存 火花纱集群vs客户端-如何选择使用哪一个?

  • 我很难理解这两种方法之间的区别 public int getConnectionsPerHost()此MongoClient实例每个主机允许的最大连接数。空闲时,这些连接将保留在池中。一旦池耗尽,任何需要连接的操作都将阻止等待可用连接。 默认值为100。 返回:每个主机连接池的最大大小 http://api.mongodb.com/java/current/com/mongodb/MongoCli

  • 本文向大家介绍小程序中的onLoad和onShow有什么区别?相关面试题,主要包含被问及小程序中的onLoad和onShow有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 onload:页面加载时触发,从二级页面回来时不会触发。onshow:当小程序启动,或从后台进入前台显示,会触发 onshow,从二级页面回来时也会触发。

  • 搜索上下文是selenium中最超级的接口,它由另一个称为网络驱动程序的接口扩展。 -所有搜索上下文和Web驱动程序接口的抽象方法都在远程WebDriver类中实现。 -所有与浏览器相关的类,如Firefox驱动程序、Chrome驱动程序等,都扩展了远程Webdriver类。 根据上面的stmt,远程web驱动程序类如何为搜索上下文接口和web驱动程序接口中定义的所有抽象方法给出定义。因为功能驱动

  • 作为JDBC的新手,我被教导使用将驱动程序注册到,这似乎不适用于我的代码: 每当我编译和运行时,结果总是1,0,0,1。我哪里做错了?