Как сохранить синхронизацию двух клиентов Datomic Cloud? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть два Datomic-клиента , открытых в двух REPL, подключенных к одной и той же базе данных в Datomic Cloud. После обработки данных в REPL 1 соединение в REPL 2 не знает, что время увеличилось до выполнения запроса.

REPL 1

Я передаю некоторые данные, получая {:db-after {:t 768}}

(d/transact conn {:tx-data [{:person/first-name "Alice"}]})
=>
{:db-before {:database-id "<some-squuid>",
             :db-name "datomic-test",
             :t 767,
             :next-t 768,
             :history false,
             :type :datomic.client/db},
 :db-after {:database-id "<some-squuid>",
            :db-name "datomic-test",
            :t 768,
            :next-t 769,
            :history false,
            :type :datomic.client/db},
 :tx-data [#datom[13194139534080 50 #inst"2018-05-15T09:18:22.565-00:00" 13194139534080 true]
           #datom[43976067064531301 73 "Alice" 13194139534080 true]],
 :tempids {}}

(d/db conn)
=>
{:t 768,
 :next-t 769,
 :db-name "datomic-test",
 :database-id "<some-squuid>",
 :type :datomic.client/db}

REPL 2

Я получил последнее известное значение базы данных, но оно все еще находится на {:t 767}

(d/db conn)
=>
{:t 767,
 :next-t 768,
 :db-name "datomic-test",
 :database-id "<some-squuid>",
 :type :datomic.client/db}

Повторный вызов d / db всегда возвращает базу данных на :t 767, одна транзакция за REPL 1. Она там заблокирована, независимо от того, как долго я буду ждать.

... Пока я не выполню запрос:

(d/q '[:find (pull ?person [*])
       :in $ ?person-name
       :where
       [?person :person/first-name ?person-name]] 
     (d/db conn)
     "Alice")
=> [] 

Запрос для недавно обработанной «Алисы» возвращает пустую коллекцию, поскольку значение базы данных, возвращенное из d/db в REPL 2, устарело. Однако действие запроса опережает базу данных, возвращенную из d/db. Теперь он «догнал»:

(d/db conn)
=>
{:t 768,
 :next-t 769,
 :db-name "datomic-test",
 :database-id "<some-squuid>",
 :type :datomic.client/db}

И повторный запуск того же запроса возвращает данные, переданные из REPL 1:

(d/q '[:find (pull ?person [*])
       :in $ ?person-name
       :where
       [?person :person/first-name ?person-name]] 
     (d/db conn)
     "Alice")
=> [[{:db/id 43976067064531301, :person/first-name "Alice"}]]

У равноправного API Datomic есть функция sync , которая, похоже, решает эту проблему на месте, однако API-интерфейс Datomic Client, похоже, не имеет ничего подобного.

Учитывая, что REPL 1 и REPL 2 представляют две независимые системы, как я могу сказать им всегда использовать последнюю версию базы данных, не выполняя поддельные запросы?

...