当前位置: 首页 > 知识库问答 >
问题:

DataStax Cassandra java驱动程序在数百次插入后与NoHost可用性异常一起崩溃

养枫涟
2023-03-14

我想写一个应用程序,将5个字符串(与文件资产相关)写入卡桑德拉。我根据数据斯塔克斯文档中的教程编写了代码。它可以工作大约 30 秒,进行几百次插入,但崩溃并出现错误:

Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (no host was tried)
    at com.datastax.driver.core.exceptions.NoHostAvailableException.copy(NoHostAvailableException.java:65)
    at com.datastax.driver.core.DefaultResultSetFuture.extractCauseFromExecutionException(DefaultResultSetFuture.java:256)
    at com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly(DefaultResultSetFuture.java:172)
    at com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:52)
...
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:744)
Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (no host was tried)
    at com.datastax.driver.core.RequestHandler.sendRequest(RequestHandler.java:103)
    at com.datastax.driver.core.SessionManager.execute(SessionManager.java:368)
    at com.datastax.driver.core.SessionManager.executeQuery(SessionManager.java:404)
    at com.datastax.driver.core.SessionManager.executeAsync(SessionManager.java:85)
    ... 8 more

该过程仍在运行,我可以重新运行单元测试,并得到相同的结果:几百次插入,然后出现这个错误。服务器没有显示出任何故障或错误的迹象。

我正在使用驱动程序:

    <dependency>
        <groupId>com.datastax.cassandra</groupId>
        <artifactId>cassandra-driver-core</artifactId>
        <version>2.0.3</version>
    </dependency>

这是我的客户端代码:

private static final String BOUND_STATEMENT = "INSERT INTO myschema.files(file_name, md5, last_modified, size, hash_date) "
        + "VALUES (?, ?, ?, ?, ?);";
@Override
public void persist(FileEntry entry) {
    Session session = cluster.connect();
    //prepare statement, if it doesn't exist.
    if (persistPs == null) {
        persistPs = session.prepare(BOUND_STATEMENT);
    }
    BoundStatement boundStatement = new BoundStatement(persistPs);
    session.execute(boundStatement.bind(entry.getFileName(), entry.getMd5(), entry.getLastModified(),
            entry.getSize(), entry.getHashDate()));
    session.close();
    System.out.print(".");
}

我正在我的本地主机上运行卡桑德拉2.0.9(带有固态驱动器和最新Macbook的OSX)。

关于如何使它不崩溃的任何线索?如果这只是 DataStax 驱动程序的问题,我很乐意使用任何其他驱动程序。

我不会产生太严重的负载,服务器进程也不会抛出任何异常或提示,说明可能出现的问题。我听说过其他组织在Cassandra上取得了成功,所以我认为这是我的客户代码。

谢谢

共有1个答案

姜鸿
2023-03-14

BryceAtNetwork23是正确的。通过我将会话对象从一个调用传递到另一个调用,问题得到了“解决”。

public final void persist(final FileEntry entry, final Session session) {
    prepareInsertStatement(session);
    final BoundStatement boundStatement = new BoundStatement(persistPs);
    //bind values from our bean to our insert query
    session.execute(boundStatement.bind(entry.getFileName(), entry.getMd5(), entry.getLastModified(),
            entry.getSize(), entry.getHashDate()));
}

private final synchronized void prepareInsertStatement(final Session session) {
    // prepare statement, if it doesn't exist.
    if (persistPs == null) {
        persistPs = session.prepare(BOUND_STATEMENT);
    }
}

我不知道这是Cassandra引擎的可扩展性还是DataStax驱动程序的问题,但通常情况下,我必须比一天在一个平台上工作更努力才能让它屈服。不管怎样,我对他们的留档感到沮丧。我从来没有在一个平台上遇到过这么多问题,让它在不崩溃的情况下运行。他们的例子在大约1000次插入后崩溃了一个节点。如果我们正在评估Cassandra,我们很可能想要插入超过1000行的数据。

也就是说,一旦我从一个调用传递到另一个调用,代码运行得非常快,执行得也很好。我有一些矛盾,但我很高兴一切终于工作。谢谢大家的帮助。

 类似资料:
  • 我正在使用数据斯塔克斯卡桑德拉2.1驱动程序,并以~8000 IOPS的速率执行读/写操作。我使用池选项来配置我的会话,并使用单独的会话进行读取和写入,每个会话都连接到群集中的不同节点作为联系点。这在 5 分钟内工作正常,但在那之后我得到很多异常,例如: 失败原因:com.datastax.driver.core.exceptions.NoHostAvailableException:尝试查询的所

  • 我需要将升级到。 Microsoft网站有以下信息: sqljdbc41.jar ;类库提供了对JDBC4.0 API的支持。它包括JDBC4.0驱动程序的所有特性以及JDBC4.0 API方法。不支持JDBC 4.1(将引发异常“SQLFeaturenotSupportedException”)。 因此,已经在java中运行的JDBC API将正常工作。 但是,Microsoft ODBC驱动程

  • 我使用Firefox驱动程序编写了许多Selenium测试,效果很好。但由于某些原因,我现在在尝试实例化Firefox驱动程序时遇到了一个异常。有人知道Firefox的任何更新可能会影响这一点吗? 下面是两行代码。异常发生在第2行:- 以下是我得到的例外情况:- “WebDriver.dll中出现“OpenQA.Selenium.WebDriverException”类型的异常,但未在用户代码中处

  • 我在spark中编写了一个简单的程序,在mySql中向表中写入一个数据帧。 计划如下: 我的项目的POM文件如下 我运行这个程序使用火花提交(尝试在本地和纱线模式)。我没有显式包含任何jar文件来运行此代码。我一直得到错误: 线程“main”java中出现异常。lang.ClassNotFoundException:com。mysql。jdbc。驾驶员 对此该怎么办?

  • 我们正在尝试使用DataStax驱动程序将CSV文件中的数据插入Cassandra。有哪些方法可以做到这一点? 我们目前使用运行cqlsh从CSV文件加载。

  • 我有selenium 2.53.1.jar、platform Windows、Java-1.8、chrome=52.0、chrome-driver.exe-2.23。 在Jenkins上进行夜间观察测试时,我看到了以下消息。 org.openqa.selenium.WebDriverException:未知错误:无法发现打开的页面(驱动信息:chromeDrive=2.23.409699 (49b