Запустите loadCache() и напишите позади

Мы используем Ignite, и для этого конкретного кеша мы хотим использовать отложенную запись, чтобы вставлять новые строки в СУБД, когда элементы добавляются в кеш.

Проблема в том, что мы хотим изначально загрузить кеш с существующими строками.

В данный момент Ignite пытается записать элементы, загруженные в cache.loadCache(), что, очевидно, нежелательно. Я хотел бы как-то указать, что эти элементы не нужно сохранять.

Мои поиски не дали ничего полезного, пожалуйста, сообщите, если можете. Это очень ценится!


person gillish    schedule 05.03.2021    source источник
comment
Как вы сохраняете записи в методе loadCache? Вы используете IgniteCache#put? Вам нужно использовать первый параметр метода loadCache (IgniteBiInClosure).   -  person Stephen Darlington    schedule 08.03.2021


Ответы (1)


IgniteCache#loadCache должен игнорировать функцию writeThrough, другими словами, записи, загруженные с помощью метода loadCache, не должны вставляться в СУБД.

Второй вариант — загрузить данные вручную, используя экземпляр кэша/стримера данных, полученный с помощью IgniteCache#witkSkipStore() или IgniteDataStreamer#skipStore.

public class CacheStoreExample {
public static void main(String[] args) {
    Ignite ignite = Ignition.start(
        new IgniteConfiguration()
            .setCacheConfiguration(new CacheConfiguration("cache")
                .setWriteThrough(true)
                .setWriteBehindEnabled(true)
                .setCacheStoreFactory(new Factory<CacheStore>() {
                    @Override public CacheStore create() {
                        return new CacheStoreAdapter() {
                            @Override public void loadCache(IgniteBiInClosure clo, Object... args) {
                                System.out.println("Loading cache with single a single key/value:");
                                clo.apply(1,1);
                            }
                            @Override public Object load(Object key) throws CacheLoaderException {return null; }
                            @Override public void write(Cache.Entry entry) throws CacheWriterException {
                                System.out.println("Writing entry: "+entry);
                            }
                            @Override public void delete(Object key) throws CacheWriterException {}
                        };
                    }
                })
    ));

    IgniteCache<Object, Object> cache = ignite.cache("cache");

    cache.loadCache((k, v) -> true);
    System.out.println("The first record:"+cache.get(1));

    System.out.println("Put operation skipping store");
    cache.withSkipStore().put(2,2);
    System.out.println("The second records:"+cache.get(2));

    System.out.println("Put operation with write trough");
    cache.put(3,3);
    System.out.println("The third record:"+cache.get(3));
}

}

person Pavel Vinokurov    schedule 08.03.2021
comment
Спасибо, это помогает! - person gillish; 09.03.2021