我想从缓存中删除大约30L(30,000,000)个数据记录,并且我使用了#igniteCache.removeAll(listOfKeys) 在这里,我正在获取密钥并传递给ignite的removeAll方法,并且工作正常。但是为了保持一致性并避免部分删除,我决定在操作中使用事务。但是问题在于:删除它需要花费很多时间,并且主要是我的ignite服务器节点已停止。
IgniteTransactions transactions = IgniteConfig.getIgnite().transactions();
tx = transactions.txStart();
IgniteCache<String, myCache> igniteCache =
IgniteConfig.getIgniteCache();
FieldsQueryCursor<List<?>> deletedKeys = igniteCache.query("select id from
mytable where timeId=xxxx");
Set<String> listOfKeys = new HashSet<>();
List<List<?>> allData = deletedKeys.getAll();
for (List keys : allData) {
listOfKeys.add(String.valueOf(keys.get(0)));
}
igniteCache.removeAll(listOfKeys);
tx.commit();
答案 0 :(得分:0)
默认并发级别为TransactionConcurrency.PESSIMISTIC,依此类推
igniteCache.removeAll(listOfKeys);
call Ignite将首先锁定所有这些键,然后在进行tx提交时将其删除。
我认为在您的情况下,如果需要以事务方式执行此操作,则需要删除SQL中的所有这些键,可以使用2.7版中引入的事务SQL: https://apacheignite-sql.readme.io/docs/transactions
此外,您可以将事务并发更改为OPTIMISTIC,这将大大减少事务处理时间。