Java Cassandra在多个异步写入同一分区时丢失数据

Java Cassandra在多个异步写入同一分区时丢失数据,java,asynchronous,cassandra,datastax,Java,Asynchronous,Cassandra,Datastax,我正在使用Cassandra2.1.14和Datastax Java驱动程序(2.1.10.2/3.0.2)。Cassandra目前正在一台测试服务器上运行。除了异步写入同一分区外,其他一切都正常工作。以下是我的代码片段: PreparedStatement insertId = session.prepare("INSERT INTO " + KEYSPACE + "." + ID_TABLE + " (" + PARTITION + ", "

我正在使用Cassandra2.1.14和Datastax Java驱动程序(2.1.10.2/3.0.2)。Cassandra目前正在一台测试服务器上运行。除了异步写入同一分区外,其他一切都正常工作。以下是我的代码片段:

PreparedStatement insertId = session.prepare("INSERT INTO " + KEYSPACE + "." + ID_TABLE +
            " (" +
            PARTITION + ", " + INDEX + ", " + ID +
            ") " +
            "VALUES (?, ?, ?) USING TTL ?").setConsistencyLevel(ConsistencyLevel.ONE);

BoundStatement boundStatement = new BoundStatement(insertId);

for (int i = 0; i < list.size(); i++) {
    if (ASYNC_WRITE) {
        ResultSetFuture resultSetFuture = session.executeAsync(boundStatement.bind(partition, i, list.get(i), TTL_SECONDS));

        Futures.addCallback(resultSetFuture, new FutureCallback<ResultSet>() {

            @Override
            public void onFailure(Throwable e) {
                Logger.Log.error("Exception: " + Logger.getStackTraceString(e));
            }

            @Override
            public void onSuccess(ResultSet results) {
                Logger.Log.debug("OK");
            }
        });
    } else {
        session.execute(boundStatement.bind(partition, i, list.get(i), TTL_SECONDS);
    }
}
PreparedStatement insertId=session.prepare(“插入到”+KEYSPACE+”+ID_表中+
" (" +
分区+”,“+索引+”,“+ID”+
") " +
“使用TTL的值(?,?).SetConsistenceLevel(ConsistenceLevel.ONE);
BoundStatement BoundStatement=新的BoundStatement(插入ID);
对于(int i=0;i
对于包含3个元素和异步写入的列表,只写入两个元素,例如0和2或1和2。不会引发任何异常,并且会为所有写入调用onSuccess()。因此,服务器上绝对没有此处提到的负载:。当我切换到同步写入时,会写入所有元素

更新
我找到了一个解决方案。看起来每次调用executeAsync之前都必须创建一个新的BoundStatement:

for (int i = 0; i < list.size(); i++) {
    BoundStatement boundStatement = new BoundStatement(insertId);
    if (ASYNC_WRITE) {
        ResultSetFuture resultSetFuture = session.executeAsync(boundStatement.bind(partition, i, list.get(i), TTL_SECONDS));

        Futures.addCallback(resultSetFuture, new FutureCallback<ResultSet>() {

            @Override
            public void onFailure(Throwable e) {
                Logger.Log.error("Exception: " + Logger.getStackTraceString(e));
            }

            @Override
            public void onSuccess(ResultSet results) {
                Logger.Log.debug("OK");
            }
        });
    } else {
        session.execute(boundStatement.bind(partition, i, list.get(i), TTL_SECONDS);
    }
}
for(int i=0;i
if(ASYNC_WRITE)条件块中的代码是否缺少某些内容?从session.executeAsync返回的future没有名称。我猜您正在使用Futures.addCallback?我看到FutureCallback方法(onFailure,onSuccess)但没有声明实现。您如何读取数据?我看到您可能会添加一个将来的回调,以便在写入时记录,但我看不到数据读取的位置/时间。@AndyTolbert我添加了缺少的行。我只是在这里写入。为了读取,我使用了Datastax DevCenter。是的,Bound语句不是线程安全的,see JAVA-1198()