首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带分页语句的驱动程序RetryPolicy

带分页语句的驱动程序RetryPolicy
EN

Stack Overflow用户
提问于 2016-08-17 20:50:50
回答 1查看 1.2K关注 0票数 2

我正在运行一个查询,获取数百万行(5.000.000左右)。我的节点似乎很忙,因为协调器返回一个com.datastax.driver.core.exceptions.ReadTimeoutException: Cassandra timeout during read query at consistency ONE (1 responses were required but only 0 replica responded)异常。(我真的不知道节点是忙着还是其他事情正在发生)。

到目前为止,我已经尝试在每个Cassandra节点上设置一个更高的read_request_timeout_in_millis,并执行如下查询

代码语言:javascript
复制
new SimpleStatement("SELECT * FROM where date = ? ",param1)
    .setFetchSize(pageSize).setConsistencyLevel(ConsistencyLevel.ONE)
    .setReadTimeoutMillis(ONE_DAY_IN_MILLIS);
ResultSet resultSet = this.session.execute(statement);

但例外情况仍在被抛出。我的下一步是尝试自定义RetryPolicy,但是可以告诉我readTimeout重试是否会再次执行整个查询,还是会从当前失败的页面重试?

我试着做这样的事:

代码语言:javascript
复制
@Override
public RetryDecision onReadTimeout(Statement statement, ConsistencyLevel cl, int requiredResponses, int receivedResponses, boolean dataRetrieved, int nbRetry) {
    if (dataRetrieved) {
        return RetryDecision.ignore();
    } else if (nbRetry < readRetries) {
        LOGGER.info("Retry attemp {} out of {} ",nbRetry,readRetries);
        return RetryDecision.retry(cl);
    } else {
        return RetryDecision.rethrow();
    }
}

其中,readReatries是我为获取数据而安排的重试次数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-18 08:35:21

当您在查询上使用fetch大小时,驱动程序永远不会预先发出整个查询。即使没有指定fetch大小,驱动程序也会使用5000作为获取大小,以防止使用许多对象重载内存。正在发生的情况是,结果块是通过发出有限制的查询来获取的,当您迭代结果时,当您到达块驱动程序结束时,将发出以下结果数的查询,等等。总之,如果结果数目较大,那么获取大小的查询将从驱动程序发出到集群。在官方datastax驱动程序页面上可以看到漂亮的序列图以及其他解释。

也就是说,RetryPolicy只在单个语句上工作,并且对获取大小一无所知,因此该语句将被重新尝试定义的次数(这意味着只有该块在超时时才会被重新尝试)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39006050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档