PreparedStatements 是不是由 CQL 字符串缓存? Datastax PreparedStatement 是不是保留语句 ID?
Posted
技术标签:
【中文标题】PreparedStatements 是不是由 CQL 字符串缓存? Datastax PreparedStatement 是不是保留语句 ID?【英文标题】:Are PreparedStatements cached by CQL string? Does Datastax PreparedStatement retain statement ID?PreparedStatements 是否由 CQL 字符串缓存? Datastax PreparedStatement 是否保留语句 ID? 【发布时间】:2014-01-31 16:08:19 【问题描述】:服务器端和客户端的语句缓存是严格按照 PreparedStatement 的字符串呈现方式缓存的,还是其他的?换句话说,如果两个不同的 PreparedStatement 是通过不同的方式创建的,但最终具有完全相同的 CQL 文本呈现,它们是否都必须准备好(假设相同的服务器)?如果他们来自不同的客户?
更不重要的是......在什么情况下客户端能够在不咨询服务器的情况下将 PreparedStatement 转换为语句 ID?
(我来自 Oracle 经验,如果有帮助的话。)
【问题讨论】:
【参考方案1】:如果两个不同的 PreparedStatement 是通过不同的方式创建的, 但最终会得到完全相同的 CQL 文本渲染,他们会吗? 两者都必须准备好(假设同一台服务器)?如果他们来自 不同的客户?
从不同的客户端执行相同的语句
刚刚对此进行了测试,两个客户端两次执行相同的预处理语句,o.a.c.cql3.QueryProcessor#preparedStatements
中的 cql 语句缓存最终存储了 2 条语句,即使它们的字符串呈现相同,这意味着缓存了不同客户端的 PreparedStatements。
从同一个客户端执行同一个语句 来自单个客户端的重复语句不会被缓存两次,因此它们可以被重用并且不必重新编译,当客户端执行相同的准备好的语句时,它只发送语句 id 和参数。
【讨论】:
以上是关于PreparedStatements 是不是由 CQL 字符串缓存? Datastax PreparedStatement 是不是保留语句 ID?的主要内容,如果未能解决你的问题,请参考以下文章
如何在多线程环境中生成 PreparedStatements?
是否有更快(更简洁)的方法来为 JDBC 中的 PreparedStatements 设置许多参数?