update table1 a
set a.col1='Y'
where exists(select 1
from table2 b
where a.col1=b.col1
and a.col2=b.col2
)
В ответ на (1) ваша функция get-cand
выглядит очень похожей по структуре с использованием из clojure.core/cache
. Вы можете посмотреть в кеши FIFO / LIFO / TTL, которые также могут быть просто обернуты в атом для обновления.
Что касается (2), хотя я не думаю, что это фактически считается «мутацией» (может быть, эксперт сможет уточнить), я считаю, что вполне разумно иметь большие кэшированные предварительные вычисления (в конце концов Таблица поиска [ 114] распространены, например, при обработке изображений, и они в основном являются предварительно гидратированными кешами).
Я бы сделал это так, как вы предлагаете. Нет необходимости использовать dosync
& amp; alter
с ref
для этого. Просто используйте локальный atom
в каждом model
. Это может быть тогда GC'd, когда модель больше не используется.
Обновление
Одной из альтернатив Java является использование LinkedHashMap. Вы можете установить максимальный размер и переопределить функцию removeEldestEntry()
для управления поведением.
Обратите внимание, что этот синтаксис немного отключен, но я уверен, что вы знаете, как его исправить:
((deref...