2013-02-25 8 views
3

Я знаю, что мы можем вставить одну запись в Кассандре с чем-то вроде этого (пример ниже взяты из here):Пакетная вставка с API-интерфейсом Astyanax CQL3?

final String INSERT_STATEMENT = "INSERT INTO employees (empID, deptID, first_name, last_name) VALUES (?, ?, ?, ?);"; 

result = keyspace 
    .prepareQuery(CQL3_CF) 
    .withCql(INSERT_STATEMENT) 
    .asPreparedStatement() 
    .withIntegerValue(222) 
    .withIntegerValue(333) 
    .withStringValue("Eric") 
    .withStringValue("Cartman") 
    .execute(); 

Можно ли сделать пакетное вставку (для нескольких записей) с cql3 API Astyanax в (например, JDBC's executeBatch)?

ПРИМЕЧАНИЕ: Использование MutationBatch от Astyanax (которое основано на Thrift, а не CQL), похоже, не является вариантом для меня, так как я столкнулся с проблемой, аналогичной this one.

+0

Почему бы не сделать это в петле? –

+0

Можете ли вы показать мне пример? Не уверен, как построить это для цикла. Кстати, CQL не позволяет вставлять несколько строк в один оператор insert (как в SQL), иначе это было бы одним из моих попыток. –

ответ

6

Для получения идеальной следующие действия с помощью Astyanax:

С cqlsh:

cqlsh:TEST_KS> INSERT INTO "MESSAGE_CF" (KEY, "DELETED_RECEIVER", "DELETED_SENDER", "SENDER") 
       VALUES ('user-1241324', 'Yes', 'No', '[email protected]'); 
cqlsh:TEST_KS> SELECT * FROM "MESSAGE_CF";                 
key   | DELETED_RECEIVER | DELETED_SENDER | RECEIVER | SENDER 
--------------+------------------+----------------+----------+--------------- 
user-1241324 |    Yes |    No |  null | [email protected] 

С Astyanax:

Keyspace keyspace = Astyanax.getKeyspaceContext(); 
    ColumnFamily<String, String> mail = new ColumnFamily<String, String>(
     keyspace.getKeyspaceName(), // CF Name 
     StringSerializer.get(), // Key Serializer 
     StringSerializer.get()); // Column Serializer 

    // You could start looping here to alter what data is being inserted 
    // or make the method take in parameters and call it multiple times.   
    String cqlStatement = 
      "INSERT INTO MESSAGE_CF (KEY, DELETED_RECEIVER, DELETED_SENDER, SENDER) " 
      + "VALUES ('user-1281324', 'Yes', 'No', '[email protected]');"; 

    // execute the insertion 
    OperationResult<CqlResult<String, String>> result = 
     keyspace.prepareQuery(mail).withCql(cqlStatement).execute(); 

    // stop looping 

Как примечание: я не мог этого добиться с подготовленными операторами, Astyanax показали в своем wiki (под подготовленным CQL), что подготовленные операторы поддерживаются, но я использую astyanax-1.56.21, а функция asPreparedStatement() отсутствует.

Кроме того, для этого не забудьте установить AstyanaxContext для использования CQL3.

new com.netflix.astyanax.impl.AstyanaxConfigurationImpl()  
    .setCqlVersion("3.0.0")) //using CQL3 

UPDATE

Lookinto в batch ключевого слова. Основным фактором ускоряющих способностей партии является то, что он экономит поездки в оба конца. Управлять операциями CQL будет сложнее, но это улучшит скорость обновления. Он может выполнять операции CUD (вставлять, обновлять и удалять), но не может выполнять SELECT. Также я бы посоветовал вам прочитать CQL3 documentation, чтобы узнать, что может сделать cql.

+0

Я просто попробовал Astyanax 1.56.21, да asPreparedStatement() отсутствует. Он будет скомпилирован, если вы используете 1.56.26. –

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