Java Cassandra在多个异步写入同一分区时丢失数据
我正在使用Cassandra2.1.14和Datastax Java驱动程序(2.1.10.2/3.0.2)。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 + ", "
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()