2016-03-11 72 views
1

使用cassandra對象映射器api想要執行批量持久化。使用Cassandra中的對象映射器批量插入

對於單個對象它工作正常。

Mapper<MyObj> mapper = new MappingManager(getSession()).mapper(MyObj.class); 
mapper.save(myObj); 

對於批量更新我想通過這種方式,但理想Cassandra是想我堅持的列表,以便它給像@Table註釋例外列表中沒有找到,這是預期的行爲

Mapper<List<MyObj>> mapper = new MappingManager(getSession()).mapper(List.class); 
myObjList.add(myObj1) 
myObjList.addd(myObj2) 
mapper.save(myObjList); 

有沒有一種方法可以在批量使用cassandra中實現同樣的功能?

注意:或者我可以通過使用for循環重複第一步來做到這一點,但我正在尋找一個批量插入@ObjectMapper。

回答

2

Datastax對象映射器框架中沒有批量插入實用程序。

您可以按照您的建議一個接一個地將您的實體插入for循環,或尋找更高級的映射框架,如Achilles

+0

或類似這樣的主題建議你可以使用PreparedStatement的:http://stackoverflow.com/questions/19202812/how-to-use-asynchronous-batch-writes-feature-with-datastax-java-driver – nukie

+0

@nukie你是對的,但我正在尋找一個Object-Mapper解決方案。 – lambodar

+0

@adutra用於批量的單個/共同特徵,它沒有任何意義,一起導入一個跟腱庫。如果可能的話,請使用object-mapper添加積壓以支持批處理功能。 – lambodar

6

這是我想在上面的線程中總結表單@adutra討論的代碼片段。

您可以利用與cassandra-core驅動程序一起提供的BatchStatement的優勢,並且它與cassandra-mapper非常兼容。

Mapper<MyObj> mapper = new MappingManager(getSession()).mapper(MyObj.class); 
BatchStatement batch = new BatchStatement(); 
batch.add(mapper.saveQuery(myObj1)); 
batch.add(mapper.saveQuery(myObj2)); 
session.execute(batch); 
+1

要真正完整:我沒有直接引導你到'BatchStatement'選項的原因是因爲批處理查詢不一定是最好的選擇,有時單獨/並行執行每個語句可以更快:請參閱[本博客文章](https://lostechies.com/ryansvihla/2014/08/28/cassandra-batch-loading-without-the-batch-keyword/)瞭解更多信息。 – adutra