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昂貴/慢創建/消耗大量內存等原因,以保持其數量低?
感謝您的明確答案。希望他們將這些信息添加到下一版Cassandra手冊中。 – user4955663