批量查询到Cassandra

时间:2014-06-05 03:35:49

标签: java cassandra batch-processing datastax

我正在尝试将一批对象插入到Cassandra中,如下所示:

public void insertIntoCassandra(ArrayList<FileLoaderVo> LoadVo)
        throws NitroLoaderException {

    int temp = LoadVo.size();

    try {
        Session session = cassandraDAO.getSession();
        if (session == null) {
            String msg = "CassandraDAO.getSession() returned null";
            logger.error(msg);
            throw new FileLoaderException(msg);
        }

        BoundStatement bStmtHistTable = null;

        if (pStmtHistTable == null) {
            pStmtHistTable = session.prepare(insertToCassandra);
            pStmtHistTable.setConsistencyLevel(ConsistencyLevel.ONE);
        }

        for (FileLoaderVo fileLoaderVo : LoadVo) {              

            bStmtHistTable = pStmtHistTable.bind(fileLoaderVo.getSecurityCode(),
                    fileLoaderVo.getType(), fileLoaderVo.getAreaCode(),
                    fileLoaderVo.getEmpName(), fileLoaderVo.getCityType(),
                    fileLoaderVo.getHomeFIPS(), fileLoaderVo.getLastName(),
                    fileLoaderVo.getDst(), fileLoaderVo.getCssCode(),
                    fileLoaderVo.getAbbr(), fileLoaderVo.getOfficeFIPS(),
                    fileLoaderVo.getMiddleName(), fileLoaderVo.getZone(),
                    fileLoaderVo.getUtc());

            session.execute(bStmtHistTable);
            logger.info("LoadVo.size() is :"+temp);
            temp--;
        }
    } catch (Exception e) {
        System.out.println(e);
    }

}

这里我将这个方法传递给要插入Cassandra的对象的ArrayList。 但有没有办法像批量插入一样对这些对象运行单个查询?

我已经研究过datastax但找不到任何东西,您的意见将会受到赞赏。

提前致谢。

2 个答案:

答案 0 :(得分:2)

不同分区的批处理会给协调器增加很多开销,因此除非你想确保语句成功,即使coordindator和你的应用程序崩溃,也不建议这样做。

您可能会看到制作许多异步调用然后收集结果并重试任何失败的最佳性能。

有关常见反模式的完整详情,请参阅:

记录批次:http://christopher-batey.blogspot.co.uk/2015/03/cassandra-anti-pattern-cassandra-logged.html

未记录的批次:http://christopher-batey.blogspot.co.uk/2015/02/cassandra-anti-pattern-misuse-of.html

答案 1 :(得分:1)

根据您正在运行的Cassandra版本,TV可以将绑定语句添加到批处理(C * 2.0)或准备批处理语句(C * 1.2)。这篇博客文章涵盖了以下两个选项:http://www.datastax.com/dev/blog/client-side-improvements-in-cassandra-2-0

基本上使用C * 2.0,您可以:

if (pStmtHistTable == null) {
    pStmtHistTable = session.prepare(insertToCassandra);
    pStmtHistTable.setConsistencyLevel(ConsistencyLevel.ONE);
}
// create a batch statement
BatchStatement batch = new BatchStatement();

for (FileLoaderVo fileLoaderVo : LoadVo) {
    // add bound statements to the batch
    batch.add(pStmtHistTable.bind(...));
}
// execute all
session.execute(batch);