java - Cassandra 不等待节点可用
问题描述
我正在使用 java 的 datastax 驱动程序:
@Dao
public interface MyDao {
@Insert
CompletableFuture<Void> save(MyEntity entity);
...
}
public class MyDaoTests {
@Test
public void myTest() {
...
List<CompletableFuture<Void>> futureList = myEntityList.parallelStream()
.map((myEntity) -> meterDataMapper.myDao().save(myEntity))
.collect(Collectors.toList());
CompletableFuture.allOf(futureList.toArray(CompletableFuture[]::new)).join();
...
}
}
当我执行测试时,我得到这个错误:
java.util.concurrent.CompletionException: com.datastax.oss.driver.api.core.NoNodeAvailableException: No node was available to execute the query
有没有办法配置驱动程序/会话以等待可用节点?
更多信息:
- 我的测试规模约为 2500000 个实体 (
myEntityList
)。 - 同步插入工作正常,但它们太慢了。
- 我想使用基于注释的datastax-java-driver mapper尽可能简单地解决这个问题。
- 驱动程序版本:4.9.0
解决方案
当NoNodeAvailableException
驱动程序将所有节点标记为关闭或无响应,或者接触点无效(在您的情况下不太可能)时,将返回 。
这不是让驱动程序等待节点重新联机的情况。由于驱动程序认为所有节点都不可用,因此它甚至不会尝试连接到任何节点。
查看节点上的日志以获取有关它们为何无响应的线索。如果您看到长时间的 GC 暂停和/或丢弃的读取/突变,则表明节点已超载。如果您正在运行负载测试,请考虑限制吞吐量,以免集群过载。干杯!
推荐阅读
- flutter - 如何在颤动中同时换行和缩小文本?
- unit-testing - 如何在 Rust 中运行任何测试之前运行设置代码?
- php - 如何检查值一个数组元素是否完全存在于另一个数组中并在php中创建新数组作为不同数组值的容器
- python - 使用python将多个未排序的文本文件合并为一个排序文件
- javascript - 如何从 ng2 智能表中的 API 获取数据?
- ios - 我可以在 XCode 的故事板编辑器中指定一个目标吗?
- sql-server - 导入具有多个分隔符的平面数据
- javascript - window.alert 之后的代码间歇性执行
- reactjs - Css scoped in single Component
- java - Array deletion taking place from the lower index first?