Java Cassandra Bounder语句的线程安全性

Java Cassandra Bounder语句的线程安全性,java,multithreading,cassandra,thread-safety,prepared-statement,Java,Multithreading,Cassandra,Thread Safety,Prepared Statement,它说: 您应该只准备一次,并将PreparedStatement缓存在 应用程序(它是线程安全的)。。。BoundStatement不是 线程安全。可以使用不同的方法多次重用实例 参数,但仅来自单个线程且仅当使用 同步呼叫: 很明显,上面的代码不是线程安全的,但是如果我们以这种方式更改代码: BoundStatement bound1 = ps1.bind(); BoundStatement bound2 = ps1.bind(); bound1.setString("sku", "32438

它说:

您应该只准备一次,并将PreparedStatement缓存在 应用程序(它是线程安全的)。。。BoundStatement不是 线程安全。可以使用不同的方法多次重用实例 参数,但仅来自单个线程且仅当使用 同步呼叫:

很明显,上面的代码不是线程安全的,但是如果我们以这种方式更改代码:

BoundStatement bound1 = ps1.bind();
BoundStatement bound2 = ps1.bind();

bound1.setString("sku", "324380");
session.executeAsync(bound1);

bound2.setString("sku", "324381");
session.executeAsync(bound2);
也就是说:对多个线程使用公共PreparedStatement,每个线程使用自己的BoundStatement

1) 这个线安全吗


2) 这是不是建议用预先准备好的语句并行执行的方法?或者BoundStatement创建/消耗大量内存等是否昂贵/缓慢?

简短的回答是,如果您想多次使用相同的
PreparedStatement
对象,但每次使用不同的
BoundStatement
对象绑定不同的参数,那么它就是线程安全,因为
PreparedStatement
是线程安全的,所以您可以在多个线程中恢复它,而
BoundStatement
不是线程安全的,所以每次都有不同的对象

为了清楚起见,线程1将使用
ps1=session.prepare(“插入产品(sku,描述)值(?)”)创建prepare语句
和所有其他线程将使用此
ps1
对象创建自己的
BoundStatement
对象,因为每个线程都有自己要传递的值,例如:

线程1将绑定并执行为(注意,使用相同的
ps1
对象):

线程2将绑定并执行为(注意,使用相同的
ps1
对象):

线程3将绑定并执行为(注意,使用相同的
ps1
对象):


简而言之:创建
PreparedStatement
对象时会产生主要的性能成本,因为它需要往返到DB服务器(请参见下面的描述),因此您可以重用它,并且它是线程安全的,每次创建一个单独的
BoundStatement
,因为它不是线程安全的,也不是一个很难创建的对象,并且不需要往返到DB服务器


谢谢你的明确回答。希望他们能在下一版本的卡桑德拉手册中加入这一信息。
BoundStatement bound1 = ps1.bind();
BoundStatement bound2 = ps1.bind();

bound1.setString("sku", "324380");
session.executeAsync(bound1);

bound2.setString("sku", "324381");
session.executeAsync(bound2);
BoundStatement bound = ps1.bind().setString("sku", "001").setString("description", "LCD screen"); 
session.execute(bound);
BoundStatement bound = ps1.bind().setString("sku", "002").setString("description", "TFT screen"); 
session.execute(bound);
BoundStatement bound = ps1.bind().setString("sku", "003").setString("description", "LED screen"); 
session.execute(bound);