服务器端和客户端端的语句缓存是否严格地通过PreparedStatement的字符串再现或其他方式缓存?换句话说,如果通过不同的方式创建两个不同的PreparedStatements,但最终具有完全相同的CQL文本呈现,它们是否都必须准备(假设相同的服务器)?如果他们来自不同的客户?
更重要的是......在什么条件下,客户端能够在不咨询服务器的情况下从PreparedStatement转换为语句ID?
(如果有帮助的话,我来自Oracle经验。)
答案 0 :(得分:4)
如果通过不同方式创建两个不同的PreparedStatements, 但最终会得到完全相同的CQL文本渲染 两者都必须准备好(假设服务器相同)?如果他们来自 不同的客户?
从不同客户执行相同的声明
刚刚对此进行了测试,两个客户端执行两次相同的预准备语句,o.a.c.cql3.QueryProcessor#preparedStatements
中的cql语句缓存最终存储了2个语句,即使它们的字符串再现相同也意味着缓存了不同客户端的PreparedStatements。
从同一客户执行相同的声明
来自单个客户端的重复语句不会缓存两次,因此当客户端执行它仅通过语句ID和参数发送的相同预准备语句时,它们可以重用并且不必重新编译。