Question

J'essaie d'insérer un lot d'objets dans Cassandra quelque chose comme ceci:

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

}

Ici, je passe cette méthode une arrayliste d'objets à insérer dans Cassandra., Mais y a-t-il une façon de pouvoir exécuter une seule requête sur ces objets comme un insert de lot?

J'ai examiné DataStax mais je n'ai rien trouvé, vos intrants seraient appréciés.

Merci d'avance.

Était-ce utile?

La solution

Selon la version de Cassandra, vous utilisez la télévision, vous pouvez avoir des instructions liées ajoutées à un lot (C * 2.0) ou de préparer un relevé de lot (C * 1.2).Ces 2 options sont couvertes dans ce blog post: http://www.datastax.com/dev/blog/client-side-improvements-in-cassandra-2-0

Fondamentalement avec C * 2.0, vous pouvez faire:

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

Autres conseils

Les lots de différentes partitions Ajoutez beaucoup de frais généraux sur le coordinateur, ce n'est donc recommandé que si vous souhaitez vous assurer que les déclarations réussissent même si le Coordindator et votre application se bloque.

Vous verrez probablement la meilleure performance de faire de nombreux appels ASYNC, puis de collecter les résultats et de réessayer tout ce qui a échoué.

Pour plus de détails, y compris les anti-motifs communs, voir:

Lots enregistrés: http://Christophaler-Batey.Blogspot.co.uk/2015/03/cassandra-Anteri-Pattern-Cassandra-logged.html

lots non dégagés: http://Christophaler-Batey.Blogspot.co.uk/2015/02/Cassandra-Antim.HTML

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top