2016-08-31 34 views
0

记录我使用DataStax Java驱动程序批量插入是唯一一个在卡桑德拉

  PreparedStatement pstmt = cqlSession.prepare("INSERT INTO ks_mobapp.messages(pair_id, date, belong_to, message_id, text, sender) VALUES(?, ?, ?, ?, ?, ?);"); 
      BoundStatement boundStatement = new BoundStatement(pstmt); 
      BatchStatement batchStmt = new BatchStatement(); 
      batchStmt.add(boundStatement.bind(pair, formatDate, pairSplit[0], obj.getLong("time"), text, sndrId)); 
      batchStmt.add(boundStatement.bind(pair, formatDate, pairSplit[1], obj.getLong("time"), text, sndrId)); 
      cqlSession.execute(batchStmt); 

这里pairSplit[0] & pairSplit[1]是不同的,但最后只有一条线是插入有这样的代码。

她是我的表

CREATE TABLE messages (
    pair_id text, 
    date text, 
    message_id bigint, 
    text text, 
    sender text, 
    belong_to text, 
    PRIMARY KEY((pair_id, date, belong_to), message_id) 
); 

回答

1

我看了看他们的样品演示。我认为你需要两个不同的BoundStatement对象。

没有这个,恐怕你最终可能会通过两次相同的参考。这是在java中工作的常用方式(我们避免深度复制对象)。

0

您正在覆盖相同的BoundStatement。这将工作:

 PreparedStatement pstmt = cqlSession.prepare("INSERT INTO ks_mobapp.messages(pair_id, date, belong_to, message_id, text, sender) VALUES(?, ?, ?, ?, ?, ?);"); 
     BatchStatement batchStmt = new BatchStatement(); 
     batchStmt.add(new BoundStatement(pstmt).bind(pair, formatDate, pairSplit[0], obj.getLong("time"), text, sndrId)); 
     batchStmt.add(new BoundStatement(pstmt).bind(pair, formatDate, pairSplit[1], obj.getLong("time"), text, sndrId)); 
     cqlSession.execute(batchStmt); 

问候