Apache Cassandra DefaultRetryPolicy不支持网络断开连接?
我正在使用datastax cassandra driver core 3.1.0,为了开始学习cassandra,我设置了一个3节点集群(笔记本电脑中运行着3个VM) 群集连接是通过以下方式完成的(传递接触点列表): 我创建了一个测试,定期对集群执行相同的查询,并设置了consistentylevel.ONE 我的期望是,如果一个或两个节点失败,查询仍然能够得到结果(由于ConsistenceLevel.one和DefaultRetryPolicy) 发生的情况是:Apache Cassandra DefaultRetryPolicy不支持网络断开连接?,cassandra,datastax-java-driver,Cassandra,Datastax Java Driver,我正在使用datastax cassandra driver core 3.1.0,为了开始学习cassandra,我设置了一个3节点集群(笔记本电脑中运行着3个VM) 群集连接是通过以下方式完成的(传递接触点列表): 我创建了一个测试,定期对集群执行相同的查询,并设置了consistentylevel.ONE 我的期望是,如果一个或两个节点失败,查询仍然能够得到结果(由于ConsistenceLevel.one和DefaultRetryPolicy) 发生的情况是: 如果我通过停止cassan
protected static ResultSet executeRockSolid(Session session, BoundStatement boundStatement) {
ResultSet results = null;
try {
results = session.execute(boundStatement);
} catch (OperationTimedOutException e) {
System.err.format("Retrying. Caused by: %s", e.toString());
results = session.execute(boundStatement);
} catch (TransportException e) {
System.err.format("Retrying. Caused by: %s", e.toString());
results = session.execute(boundStatement);
} catch (ReadTimeoutException e) {
System.err.format("Retrying. Caused by: %s", e.toString());
results = session.execute(boundStatement);
} catch (Exception e) {
System.err.println(e);
}
return results;
}
但是,我真的不喜欢将我自己的代码用于我认为应该由客户提供的东西
因此,问题是:
我观察到的行为是正常的还是错误的
如果是正常的,那么让客户端透明地支持“服务器断开网络连接”的最佳选择是什么
如果最好的选择是创建自定义重试策略,那么参数/实现是什么?您是否将语句标记为幂等?不,我没有将它们设置为幂等,您是对的,在我设置语句幂等后,查询执行不会引发超时异常,但现在,“问题”已移动到session.prepareStatement方法,该方法有时会引发TransportException,如从测试应用程序日志中获取的以下示例所示:Preparing语句--------------------------------------------com.datastax.driver.core.exceptions.TransportException:[/10.0.2.15:9042]连接已关闭。下一次迭代,它将毫无例外地运行。您应该在应用程序启动时只准备一次,如果您动态地这样做,最好不要使用准备好的语句。是的,我知道,但我不能设置一致性级别或幂等性。一个简单的查询,它必须是一个准备好的语句。无论如何,在我第一次创建prepared语句时它可能会失败,对吗?创建一个SimpleStatement,您可以在没有prepared的情况下设置一致性级别和幂等项。值得注意的是,您可以忽略准备好的语句日志记录。如果它试图将一条语句发送到一个没有准备好的实例,它只会在封面下重新准备。你是否将语句标记为幂等的?不,我没有使它们成为幂等的,你是对的,在我设置语句幂等后,查询执行不会抛出超时异常,但现在,问题是已移动到session.prepareStatement方法,该方法有时会引发TransportException,如从测试应用程序日志中获取的以下示例所示:Preparing语句--------------------------------------------com.datastax.driver.core.exceptions.TransportException:[/10.0.2.15:9042]连接已关闭。下一次迭代,它将毫无例外地运行。您应该在应用程序启动时只准备一次,如果您动态地这样做,最好不要使用准备好的语句。是的,我知道,但我不能设置一致性级别或幂等性。一个简单的查询,它必须是一个准备好的语句。无论如何,在我第一次创建prepared语句时它可能会失败,对吗?创建一个SimpleStatement,您可以在没有prepared的情况下设置一致性级别和幂等项。值得注意的是,您可以忽略准备好的语句日志记录。如果它试图向一个没有准备好的实例发送一条语句,它只会在封面下重新准备
protected static ResultSet executeRockSolid(Session session, BoundStatement boundStatement) {
ResultSet results = null;
try {
results = session.execute(boundStatement);
} catch (OperationTimedOutException e) {
System.err.format("Retrying. Caused by: %s", e.toString());
results = session.execute(boundStatement);
} catch (TransportException e) {
System.err.format("Retrying. Caused by: %s", e.toString());
results = session.execute(boundStatement);
} catch (ReadTimeoutException e) {
System.err.format("Retrying. Caused by: %s", e.toString());
results = session.execute(boundStatement);
} catch (Exception e) {
System.err.println(e);
}
return results;
}