Я знаю о компонентах и системе (их еще не использовали), но я хотел бы знать, как инициализировать ресурс, когда метод init может запускаться из любого потока. Допустим, у нас есть 10 потоков, и все они используют db, и потоки могут начинаться в любом порядке. Как инициализировать пул подключений db в таком случае?Каков правильный способ инициализации ресурсов в многопоточной программе в Clojure
В настоящее время я использую сравнение и настроен для этого, но почему-то это не так. Это то, что я делаю.
(let [datasource (atom nil)]
(defn pooled-conn
"Get a Hikari pooled connection to the database. There will only be one
connection pool for the vm. Additional calls to this function will return
the same connection pool. The connection pool will be created by the first
call to this function"
[datasource-options]
(when (nil? @datasource)
(let [ds (make-datasource datasource-options)]
(when-not (compare-and-set! datasource nil {:datasource ds})
(close-datasource ds))))
@datasource))
Я не знаю, когда начинается виртуальная машина, только когда моя начинается нить (я использую шторм, дб пул инициализируется в некоторых болтах). Есть лучший способ сделать это?
Вы упомянули компоненты и систему, вы также можете проверить [mount] (https://github.com/tolitius/mount) для более естественного ощущения clojure. – Shlomi
Выглядит круто @ Шломи, проверит его – Ravi