首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >cachePrepStmts和useServerPrepStmts在MySQL JDBC驱动程序中的区别是什么?

cachePrepStmts和useServerPrepStmts在MySQL JDBC驱动程序中的区别是什么?
EN

Stack Overflow用户
提问于 2015-08-29 13:21:41
回答 1查看 17.6K关注 0票数 25

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

  • 如果服务器支持useServerPrepStmts --使用服务器端准备的语句?
  • cachePrepStmts -驱动程序应该缓存客户端准备语句的PreparedStatements解析阶段,检查服务器端准备的语句和服务器端准备的语句本身的适用性吗?

客户端准备的语句是重用PreparedStatements对象的一种方式吗?

如果启用了useServerPrepStmts,那么究竟在缓存什么,因为MySQL没有无论如何,执行计划缓存

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-18 06:35:46

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

客户准备的报表

客户端准备的语句是“模拟”准备的语句。这意味着SQL语句字符串在客户端被标记,在将语句发送到服务器执行之前,任何占位符都被替换为文字值。每次执行时都会向服务器发送完整的SQL语句。您可以使用普通日志来研究这是如何工作的。例如:

以下代码:

代码语言:javascript
运行
复制
ps=conn.prepareStatement("select ?")
ps.setInt(1, 42)
ps.executeQuery()
ps.setInt(1, 43)
ps.executeQuery()

将显示在日志中:

代码语言:javascript
运行
复制
255 Query  select 42
255 Query  select 43

“查询”表示,在协议级别上,发送一个COM_QUERY命令,下面是语句字符串。

服务器准备语句

服务器准备语句是“真”准备语句,意思是将查询文本发送到服务器,解析后,占位符和结果信息返回给客户端。这就是设置useServerPrepStmts=true时得到的结果。语句字符串只使用COM_STMT_PREPARE调用一次发送到服务器(有文档的这里)。每个执行都通过发送一个带有准备语句句柄和文字值的COM_STMT_EXECUTE来代替占位符来执行。

与客户端准备的示例不同,我们可以使用类似的代码块(但这次启用了服务器准备的语句):

代码语言:javascript
运行
复制
ps2=conn2.prepareStatement("select ?")
ps2.setInt(1, 42)
ps2.executeQuery()
ps2.setInt(1, 43)
ps2.executeQuery()

日志会显示:

代码语言:javascript
运行
复制
254 Prepare    select ?
254 Execute    select 42
254 Execute    select 43

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

缓存准备好的语句

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

MySQL JDBC选项cachePrepStmts将以这种方式缓存准备好的语句(客户端和服务器准备语句),并缓存语句的“可准备性”。MySQL中有些语句在服务器端是不可准备的。如果认为可能,驱动程序将尝试在服务器上准备语句,如果准备失败,则返回到客户端准备语句。这张支票很贵,因为需要往返到服务器.该选项还将缓存此检查的结果。

希望这能有所帮助。

票数 74
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32286518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档