Cassandra - com.datastax.driver.core.exceptions.DriverException:尝试获取可用连接时超时

时间:2015-11-04 08:49:13

标签: java cassandra key-value-store

我在Cassandra中遇到以下持久性错误:

Cassandra-所有主机尝试查询失败(尝试:xxxxxx(com.datastax.driver.core.exceptions.DriverException:尝试获取可用连接时超时)(您可能希望增加驱动程序数量)主机连接))))

当我尝试将大型数据库加载到单个群集时,会出现问题。到目前为止,我已经尝试了有关此问题的所有建议:

  • 我只有一个群集和一个会话
  • 我正在使用准备好的插入声明
  • 我慷慨地增加了双方的超时时间

我在这里粘贴我正在使用的功能,按照此blog post中的建议加载,也许有人可以发现某些内容。更改BATCH_SIZE是唯一能够以某种方式改善情况的因素。如果我在1_000_000中设置它几乎立即失败,如果我将其设置为100_000它运行了相当长的一段时间。在下面的代码中,pstatement是PreparedStatement,而future是a 列表< ResultSetFuture>

public boolean addPair(byte[] key, byte[] value) throws IOException {
    if (futures.size() >= BATCH_SIZE) {
      flush();
    }
    BoundStatement boundStatementInsert = new BoundStatement(pstatement);
    futures
           .add(session.executeAsync(boundStatementInsert.bind(ByteBuffer.wrap(key), ByteBuffer.wrap(value)).setConsistencyLevel(ConsistencyLevel.ALL)));
    return true; }


private void flush() {
    for (ResultSetFuture rsf : futures) {
      rsf.getUninterruptibly();
    }
    futures.clear(); }

提前致谢

Altober

2 个答案:

答案 0 :(得分:2)

驱动程序不会同时处理超过给定主机的最大请求数。此数字取决于您的池配置,请参阅详细信息here(使用左上角的组合以匹配您的驱动程序版本)。

如果您尝试发送更多请求,他们将排队等候。消息Timeout while trying to acquire available connection表示排队请求超时,换句话说,您发送的内容超出了驱动程序可以处理的范围。

使用驱动程序默认值时,最大值应为1024.这是非常保守的,考虑到您描述的设置,我认为您可以更高。尝试添加更多连接和/或增加每个连接的请求数,相应地调整BATCH_SIZE

答案 1 :(得分:-3)

批次是一次更新/插入多个表格的最佳方式。批量应该很小,低于5 kb的数据。批量用于原子性,而不是性能优化。请参考https://media.com/@foundev/cassandra-batch-loading-without-the-batch-keyword-40f00e35e23e以获得更快的数据插入,并且不使用批处理语句