1

This doc guides how to use Cassandra prepared and bound statements.線程安全

它說:

你應該準備只有一次,並在你的應用程序 緩存的PreparedStatement(它是線程安全的)。 ... BoundStatement不是 線程安全的。你可以用不同的 參數多次重複使用的實例,但只能從單個線程且僅當您使用 同步調用:

BoundStatement bound = ps1.bind(); 

// This is safe: 
bound.setString("sku", "324378"); 
session.execute(bound); 

bound.setString("sku", "324379"); 
session.execute(bound); 

// This is NOT SAFE. executeAsync runs concurrently with your code, so the first execution might actually read the 
// values after the second setString call, and you would insert 324381 twice: 
bound.setString("sku", "324380"); 
session.executeAsync(bound); 

bound.setString("sku", "324381"); 
session.executeAsync(bound); 

很顯然,上面是不是線程安全的,但如果我們改變這樣的代碼:

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)這是否推薦使用預處理語句執行並行執行的方法?或者是BoundStatements昂貴/慢創建/消耗大量內存等原因,以保持其數量低?

回答

2

簡短的回答是,如果你正在考慮使用同一個PreparedStatement對象多次,但使用不同的參數,每次使用不同BoundStatement對象界,那麼它是線程安全的,因爲PreparedStatement是線程安全的,所以你可以resuse其多線程和BoundStatement不是線程安全的,所以你每次都有不同的對象。

只要是明確的 - 所以,你的線程1將創建您使用ps1 = session.prepare("insert into product (sku, description) values (?, ?)");準備語句和所有其他線程將使用此ps1對象來創建自己的BoundStatement對象,因爲每次都會有自己的價值觀傳遞,例如:

線程1將結合並執行作爲(注意使用相同ps1對象):

BoundStatement bound = ps1.bind().setString("sku", "001").setString("description", "LCD screen"); 
session.execute(bound); 

線程2將結合並執行作爲(注意使用相同ps1對象):

BoundStatement bound = ps1.bind().setString("sku", "002").setString("description", "TFT screen"); 
session.execute(bound); 

線程3將結合並執行作爲(注意使用相同ps1對象):

BoundStatement bound = ps1.bind().setString("sku", "003").setString("description", "LED screen"); 
session.execute(bound); 

在簡而言之:主要性能成本招致在創建PreparedStatement對象,因爲它往返DB服務器(見下面的描述),所以你重複使用它,並且它是線程安全的,而你每次創建一個單獨的BoundStatement,因爲它不是線程安全的,也不是一個沉重的創建對象並且不需要往返DB服務器。

enter image description here

+0

感謝您的明確答案。希望他們將這些信息添加到下一版Cassandra手冊中。 – user4955663