多线程时Datastax Cassandra NoNodeAvailableException
Datastax Cassandra NoNodeAvailableException when multithreading
我正在尝试在 Java 中构建多线程 Cassandra 导入器。我正在使用这个包:
group: 'com.datastax.cassandra', name: 'cassandra-driver-core', version: '4.0.0'
单线程(使用主线程)工作正常,但即使有 1 个子线程,我也会立即收到 com.datastax.oss.driver.api.core.NoNodeAvailableException: No node was available to execute the query
我正在 Docker 中的 cassandra 实例上测试我的应用程序(希望这不是问题所在)。这是我的生成器。
session = CqlSession.builder()
.addContactPoint(new InetSocketAddress("localhost", 9042))
.withKeyspace(CqlIdentifier.fromCql("links"))
.withLocalDatacenter("datacenter1")
.build();
这就是我执行查询的方式
JSONObject json = new JSONObject(linksRow);
JsonInsert query = insertInto("links").json(json.toString());
session.execute(query.toString());
你能告诉我我做错了什么吗?根据文档,CqlSession 应该是线程安全的。 (https://docs.datastax.com/en/developer/java-driver/4.0/manual/core/)
编辑:添加了插入查询
JsonInsert query = insertInto("links").json(json.toString());
这些查询 运行 是否一直在每个线程上?
可能是本地的单个 Cassandra 节点没有足够的资源来处理多个请求。这将导致 Cassandra return 该节点对客户端“不可用”。
Cassandra 的 Java 堆有多大?它可能需要更大。也可能是本地系统与 运行 Cassandra、multi-threaded 应用程序以及其他可能 运行.
发生的事情太多了
基本上,检查 conf/jvm-server.options
的“HEAP SETTINGS”。如果堆正在“自动计算”,它可能对于应用程序试图用它做的事情来说太小了。
我正在尝试在 Java 中构建多线程 Cassandra 导入器。我正在使用这个包:
group: 'com.datastax.cassandra', name: 'cassandra-driver-core', version: '4.0.0'
单线程(使用主线程)工作正常,但即使有 1 个子线程,我也会立即收到 com.datastax.oss.driver.api.core.NoNodeAvailableException: No node was available to execute the query
我正在 Docker 中的 cassandra 实例上测试我的应用程序(希望这不是问题所在)。这是我的生成器。
session = CqlSession.builder()
.addContactPoint(new InetSocketAddress("localhost", 9042))
.withKeyspace(CqlIdentifier.fromCql("links"))
.withLocalDatacenter("datacenter1")
.build();
这就是我执行查询的方式
JSONObject json = new JSONObject(linksRow);
JsonInsert query = insertInto("links").json(json.toString());
session.execute(query.toString());
你能告诉我我做错了什么吗?根据文档,CqlSession 应该是线程安全的。 (https://docs.datastax.com/en/developer/java-driver/4.0/manual/core/)
编辑:添加了插入查询
JsonInsert query = insertInto("links").json(json.toString());
这些查询 运行 是否一直在每个线程上?
可能是本地的单个 Cassandra 节点没有足够的资源来处理多个请求。这将导致 Cassandra return 该节点对客户端“不可用”。
Cassandra 的 Java 堆有多大?它可能需要更大。也可能是本地系统与 运行 Cassandra、multi-threaded 应用程序以及其他可能 运行.
发生的事情太多了基本上,检查 conf/jvm-server.options
的“HEAP SETTINGS”。如果堆正在“自动计算”,它可能对于应用程序试图用它做的事情来说太小了。