Apache Ignite Удалить все в режиме транзакции, вызывая сбой узла - PullRequest
0 голосов
/ 28 января 2019

Я хочу удалить около 30L (30,00,000) записей данных из моего кэша, и я использовал

igniteCache.removeAll(listOfKeys) 

Здесь я выбираю ключи и передаю метод 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();

1 Ответ

0 голосов
/ 04 февраля 2019

Уровень параллелизма по умолчанию - TransactionConcurrency.PESSIMISTIC, поэтому при

  igniteCache.removeAll(listOfKeys);

вызов Ignite сначала блокирует все эти ключи, а затем удаляет при передаче tx.

Я думаю, что в вашем случае вынеобходимо удалить все эти ключи в SQL, если вам нужно сделать это транзакционно, вы можете использовать транзакционный SQL, представленный в версии 2.7: https://apacheignite -sql.readme.io / docs / Transactions

Кроме того, вы можете изменить параллелизм транзакций на OPTIMISTIC, это значительно сократит время транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...