9

我试图通过调用session.executeAsync()而不是session.execute()数据库写入来加速我们的代码。

我们有数据库连接可能断开的用例,当前execute()当连接丢失(集群中没有主机可达)时,前一个会抛出异常。我们可以捕获这些异常并重试或将数据保存在其他地方等......

使用executeAsync(),看起来没有任何方法可以满足这个用例 -ResultSetFuture需要访问返回的对象以检查结果,这将破坏首先使用的目的executeAsync()......

有没有办法在 executeAsync() 调用的任何地方添加一个监听器(或类似的东西),它将异步通知其他一些代码数据库写入失败?

这有关系吗?数据税 1.0.2 Java 1.7.40

4

2 回答 2

14

你可以尝试这样的事情,因为来自 Guava 库的ResultSetFuture工具:ListenableFuture

    ResultSetFuture resultSetFuture = session.executeAsync("SELECT * FROM test.t;");
    Futures.addCallback(resultSetFuture, new FutureCallback<ResultSet>() {
        @Override
        public void onSuccess(@Nullable com.datastax.driver.core.ResultSet resultSet) {
            // do nothing
        }

        @Override
        public void onFailure(Throwable throwable) {
            System.out.printf("Failed with: %s\n", throwable);
        }
    });

这种方法不会阻止您的应用程序。

于 2014-03-16T21:14:01.797 回答
1

您可以将回调传递给该方法以对异常采取措施。如果你需要ResultSetFuture,你可以尝试这样的事情:

interface ResultSetFutureHandler {
    void handle(ResultSetFuture rs);
}

public void catchException(ResultSetFutureHandler handler) {
    ResultSetFuture resultSet = null;
    try {
        resultSet = getSession().executeAsync(query);
        for (Row row : results.getUninterruptibly()) {
            // do something
        }
    } catch (RuntimeException e) {
        handler.handle(resultSet); // resultSet may or may not be null
    }
}

然后像这样调用它:

catchException(new ResultSetFutureHandler() {
    void handle(ResultSetFuture resultSet) {
        // do something with the ResultSetFuture
    }
});

如果您需要知道异常是什么,请添加一个异常参数:

interface ResultSetFutureHandler {
    void handle(ResultSetFuture rs, RuntimeException e);
}
于 2014-03-11T11:10:20.590 回答