语句具有一致性级别TWO定义时使用的一致性级别ALL

时间:2015-04-16 11:47:32

标签: java cassandra datastax-java-driver cassandra-2.1

我们使用java datastax cassandra驱动程序2.1.2。我们使用的Cassandra版本是2.0.9

我们有使用QueryBuilder构建的声明,我们正在明确地为TWO上的声明设置一致性级别。

Select selectStatement =  QueryBuilder.select().from(ARTICLES);
selectStatement.where(eq(ORGANIZATION_ID, organizationId));
selectStatement.setConsistencyLevel(ConsistencyLevel.TWO);

final ResultSet rs = session.execute(selectStatement);
//call to all() will be removed since it is enough to iterate over result set 
//and then you get pagination for free instead of loading everything in 
//memory
List<Row> rows = rs.all();  
for (final Row row : rows) {
   //do something with Row, convert to POJO
}

我们得到这样的例外:

com.datastax.driver.core.exceptions.ReadTimeoutException: Cassandra timeout during read query at consistency ALL (3 responses were required but only 2 replica responded)
com.datastax.driver.core.exceptions.ReadTimeoutException.copy (ReadTimeoutException.java:69)
com.datastax.driver.core.DefaultResultSetFuture.extractCauseFromExecutionException (DefaultResultSetFuture.java:259)
com.datastax.driver.core.ArrayBackedResultSet$MultiPage.prepareNextRow (ArrayBackedResultSet.java:279)
com.datastax.driver.core.ArrayBackedResultSet$MultiPage.isExhausted (ArrayBackedResultSet.java:239)
com.datastax.driver.core.ArrayBackedResultSet$1.hasNext (ArrayBackedResultSet.java:122)
com.datastax.driver.core.ArrayBackedResultSet.all (ArrayBackedResultSet.java:111)

我知道在all()上调用ResultSet会使其在内存中加载所有组织文章并使用它并在cassandra上创建负载。如评论中所述,这将被删除。这可能导致读取超时,但我仍然感到困惑,为什么在异常消息中有ALL

问题是异常告诉我们在为原始语句将其设置为ALL时使用一致性级别TWO的原因。 all()内部是否正在使用查询并默认使用CL ALL

1 个答案:

答案 0 :(得分:4)

你的问题几乎肯定是https://issues.apache.org/jira/browse/CASSANDRA-7947。您看到无法执行读取修复的错误消息。它与您原始的一致性级别无关。这已在2.1.3 +中修复。