Клиентский узел Ignite не помещает данные через серверные узлы в БД (с writeThrough только на сервере, без writeBehind)

Не могли бы вы помочь мне со следующим вопросом:

У меня следующая конфигурация кластера многораздельного кеша:

  • серверные узлы с включенной функцией writeThrough. Они могут записывать данные в БД до cacheStoreFactory=HibernateCacheStoreFactory

  • клиентские узлы без конфигурации writeThrough, но с clientMode=true

Я выполняю размещение на клиентском узле, затем я вижу, что эти данные отправляются на серверный узел, но серверный узел выполняет размещение только в кеш, но не вызывает cacheStoreFactory (поведение writeThrough). Таким образом, данные только кэшируются в кластере, но не записываются в БД.

Если я добавлю конфигурацию writeThrough к клиентским узлам, конечно, будет вызвана writeThrough, но я хотел бы удалить любые зависимости от Hibernate с клиентских узлов.

Кроме того, если я включаю конфигурацию writeBehind на стороне сервера, тогда вызывается функция writeThrough и серверный узел записывает данные из клиентского узла в БД асинхронно. Но это не удовлетворяет моим требованиям, потому что я хотел бы выполнять вводы с клиентского узла за одну транзакцию.

Можно ли выполнять вводы из клиентского узла для хранения данных серверными узлами с помощью writeThrough в транзакции без writeBehind?


person TheMrTarget    schedule 01.04.2016    source источник
comment
Не могли бы вы поделиться своей конфигурацией и для серверов, и для клиентов? Если вы можете подготовить программу junit или main() для ее локального воспроизведения, это будет прекрасно.   -  person Yakov    schedule 01.04.2016
comment
Здравствуйте, Яков. Взгляните на простой пример: files.com/shared/5703709862af6/igniteclientserver.zip Для проверки: 0) Запустите ApplicationServer 1) Запустите ApplicationClient 2) Проверьте изменения в поведении, [un] комментируя вводящие в заблуждение строки в config-server.xml: <!-- [UN]COMMENT next line to enable DB updating from client nodes --> <property name="writeBehindEnabled" value="true"/>   -  person TheMrTarget    schedule 05.04.2016


Ответы (1)


Транзакционный кеш записывает в хранилище постоянства узел, который инициировал транзакцию (в вашем случае это клиентский узел). Это сделано потому, что транзакция потенциально может включать записи, которые хранятся на разных узлах, и если хранилище будет также обновляться с разных узлов, будет невозможно поддерживать согласованность транзакций между кешем и базой данных.

Если у вас нет доступа к базе данных на клиенте, вы можете отправить закрытие на один из серверов и начать там транзакцию, например:

Ignition.ignite().compute().run(new IgniteRunnable() {
    @IgniteInstanceResource
    private Ignite ignite;

    @Override public void run() {
        try (Transaction tx = ignite.transactions().txStart()) {
            // Cache operations go here...

            tx.commit();
        }
    }
});
person Valentin Kulichenko    schedule 01.04.2016
comment
Привет, Валентин. Я подозревал такое же поведение, просматривая исходный код Ignite, но хотел бы проверить, что это архитектурное решение, а не ошибка. Большое спасибо за ответ. - person TheMrTarget; 05.04.2016
comment
@Valentin - у меня есть вопрос, так как у нас один и тот же вариант использования. Я не понял, почему база данных не обновляется, когда cacheConfiguration НЕ настроен на запись на клиентском узле. Разве это не настройка записи через часть конфигурации кеша вместо клиент-серверного узла? - person Andy Dufresne; 07.07.2016
comment
Конфигурация @AndyDufresne Cache одинакова на всех узлах. Вы не можете включить сквозную запись на сервере и отключить на клиенте. - person Valentin Kulichenko; 07.07.2016