0

我们有 JVM 应用程序与 mysql 的连接池。我们大量使用 PreparedStatements,因为我们有不超过 100 个不同的查询。驱动程序具有缓存准备好的语句的能力,因此我们获得了性能改进 - 每个语句只准备一次,并且以后不会对此查询进行 sql 解析(直到连接关闭)。从互联网上我发现proxysql支持准备好的语句,并且可以将已经准备好的语句返回给客户端,而无需在mysql中准备它(如果之前已经准备好了)。但是我没有找到任何信息,当 prepStmtCache=true 时它与客户端的行为如何?
使用 ProxySQL 在客户端使用 cachePrepStmts=true 是否安全?或者客户应该为每个查询准备语句?或者最好不要在 ProxySQL 中使用准备好的语句?

例如客户端发送 com_stmt_prepare 到 proxysql,proxysql 从池中获取连接(多路复用),检查该语句是否已经准备好,如果没有 - 将命令发送到 mysql,然后它在自己的缓存中注册准备好的语句并将准备结果返回给客户端(准备好的语句id,5例如)。客户端缓存它以连接到 ProxySQL。然后稍后客户端决定使用这个准备好的语句并发送com_stmt_execute(5, params)。这是合法的情况吗?ProxySQL 会使用与准备此语句的 mysql 的连接吗?

对于这种可能性,ProxySQL 应该有某种映射 <client stmt id, backend_connection -> mysql stmt id>。如果当前选择的连接没有映射 - 它应该首先准备它。但是我还没有发现任何关于这种映射存在的信息……也没有发现任何警告应该禁用客户端语句缓存。

4

0 回答 0