这是我的示例原始方法
public void insertIntoDb(SampleObject sample){
---------------------------------------
---------------------------------------
code to prepare Insert statement
---------------------------------------
---------------------------------------
session.executeAsync(insertStatement);
}
我正在为上述方法编写测试方法
public void insertIntoDbTest(){
--------------------------------------
---------------------------------------
preparing SampleObject and checking the size of the corresponding table before insert
---------------------------------------
---------------------------------------
obj.insertIntoDb(sampleObject)
---------------------------------------
checking the size of the corresponding table after insert
---------------------------------------
}
期望:执行上述测试方法后,应在cassandra中向表中添加1行,即如果在插入表大小之前为0,然后在插入表大小之后为1
实际:我得到的尺寸相同,即桌子前后的尺寸仅为0。
如果我替换
session.executeAsync(insertStatement);
与
ResultSetFuture future = session.executeAsync(insertStatement);
然后在下面添加语句
future.get()
然后我得到的表格大小有所不同,即1
答案 0 :(得分:1)
当您第一次尝试验证表大小时,我怀疑计算(插入)未完成。
ResultSetFuture get()
方法在必要时等待计算完成,然后检索其结果。
executeAsync
方法不会等待。
查询一经传递到基础网络堆栈,它就会立即返回。特别是,从此方法返回并不能保证查询有效,甚至不能提交给活动节点。访问ResultSetFuture时,将引发与查询失败有关的任何异常。来源:https://docs.datastax.com/en/drivers/java/2.1/com/datastax/driver/core/ResultSetFuture.html
答案 1 :(得分:1)
future.get()是阻塞代码,因此它确保异步线程执行并返回响应。在您的情况下,它将确保插入一条记录,这就是为什么在调用future.get()后断言时将大小设为1的原因;如果不调用get(),那么它将可能是异步的在这种情况下调用future.complete(),将有两种情况,一种是例外情况,另一种是没有例外情况,此方法的返回类型将是Future <> Object,您必须在方法调用跟踪上方的某个地方进行处理。