我正在尝试在cassandra数据库中构建高速插入/删除,但是没有插入第四个数据。
使用Spring Repository.save(List)时,一切都很好(但在CPU使用方面却是灾难性的)所以我尝试了提供的CassandraOperations.ingest()(或CQLOperations.ingest())。处理少量数据时一切都很顺利,但当我得到数百条记录时,我开始丢失数据。
以下是插入代码的摘录:
private final String insertPreparedCql = "insert into keyspace.MyData (s, f, m, b, av, c, AD, ga, an, ti, tim, pre, pre2, de, ch, cha, sig, rs, abc, frO, sub, sub1, en, eni, prod, gde, gude, gpde, gpd, gat, gong, glt) "
+ "values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
List<List<?>> llData = new ArrayList<>();
while(!lbufferedData.isEmpty()){
LNSData dat = lbufferedData.remove(0);
List<Object> lUniqData = new ArrayList<>();
lUniqData.add(dat.getS());
lUniqData.add(dat.getF());
lUniqData.add(dat.getM());
lUniqData.add(dat.getB));
lUniqData.add(dat.getAv());
lUniqData.add(dat.getC());
lUniqData.add(dat.getAD());
lUniqData.add(dat.getGa());
lUniqData.add(dat.getAn());
lUniqData.add(dat.getTi());
lUniqData.add(dat.getTim());
lUniqData.add(dat.getPre());
lUniqData.add(dat.getPre2());
lUniqData.add(dat.getDe());
lUniqData.add(dat.getCl());
lUniqData.add(dat.getCSI());
lUniqData.add(dat.getSSI());
lUniqData.add(dat.getRev());
lUniqData.add(dat.getABC());
lUniqData.add(dat.getFet());
lUniqData.add(dat.getSus());
lUniqData.add(dat.getSus1());
lUniqData.add(dat.getEe());
lUniqData.add(dat.getEni());
lUniqData.add(dat.getPId());
lUniqData.add(dat.getGude());
lUniqData.add(dat.getGde());
lUniqData.add(dat.getGpde());
lUniqData.add(dat.getGid());
lUniqData.add(dat.getGLat());
lUniqData.add(dat.getGng());
lUniqData.add(dat.getGt());
llData.add(lUniqData);
}
if(llData.size()>0){
logger.debug("Inserting {} elements processed data", llData.size());
cassandraTemplate.ingest(insertPreparedCql, llData);
}
当使用'watch -n 1 nodetool tpstats'时,我注意到Native-Transport-Requests有所有时间被阻止的值,所以我设置选项-Dcassandra.max_queued_native_transport_requests = 4096。没有更多被阻止的元素(或丢弃),但仍然没有正确编写所有内容。
我尝试只使用所有元素调用一次摄取,或者在较小批次中调用多次,但结果总是相同的(有不同数量的丢失数据)。
与基于PRIMAY KEY元素的删除相同。
感谢您的帮助。