2016-08-31 3 views
0

У меня есть этот код, используя DataStax Java DriverПакетная вставка только одна запись в Кассандре

  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); 

С уважением

Смежные вопросы