2015-05-04 126 views
2

就我所了解的文档和我所阅读的内容而言,准备好的声明与会话绑定。所以问题是,如果我关闭连接并重新创建连接,或者会话被终止(甚至可能如何?),必须重新创建所有准备好的语句?从连接丢失/会话重新连接中恢复PreparedStatements?

如果PreparedStatement没有被底层会话实例管理,那么Exception会得到什么?

[更新]

我已经创建了自己的简单的语句类,因为我在一个会话存在之前创建时间创建的声明表示准备好的声明。此外,我使用地图来按需映射,我准备好去......。

+0

您是否建议您会在Connection.prepareStatement()一次,然后继续使用相同的'PreparedStatement'作为剩余的应用程序生命周期? – Kayaman

+0

正确只要会话存在。该文档指出,驱动程序管理每个连接到的服务器的语句ID。所以它会节省一些带宽和一些CPU周期。好主意是你在每条语句上配置一致性级别。由于它是线程保存绑定,所以语句很简单。 –

+0

标准方法是每次打算使用它时重新创建'PreparedStatement'(禁止批量插入)。驱动程序能够缓存它们,因此我建议使用遵循标准模式的代码,而不是尝试查看连接是否已经损坏。 – Kayaman

回答

2

对于Cassandra驱动程序,标准方法是在执行之前准备一次语句并绑定变量多次。

你可以参考这篇文章:http://www.datastax.com/dev/blog/4-simple-rules-when-using-the-datastax-drivers-for-cassandra

我共享的代码片段,您可以使用。在启动突变之前,会话验证和准备声明是您在开始执行应用程序时需要做的事情。

if (session == null) { 
     session = CassandraUtils.getInstance().getSession(); 
     psUsers = session.prepare("INSERT INTO users(xx, yy, zz, tt) VALUES (?, ?, ?, ?)"); 
     psProducts = session.prepare ("INSERT INTO products(aa, bb, cc, dd) VALUES (?, ?, ?, ?)"); 
    } 

从共享贴上面:

使用每密钥空间最多只有一个会话,或者使用一个会话,并在查询

对于损失显式地指定密钥空间连接部分,驱动程序为您处理它,当然,您可以使用不同类型的重新连接策略:http://www.datastax.com/drivers/java/2.0/com/datastax/driver/core/policies/Policies.html

相关问题