批量只在cassandra中插入一条记录

时间:2016-08-31 05:26:47

标签: cassandra cql datastax-java-driver

我使用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)
);

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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);

此致