Подключение пула в Clojure - PullRequest
       2

Подключение пула в Clojure

0 голосов
/ 10 февраля 2019

Я не могу понять, как использовать функции pool-db и connection в этом руководстве по пулу соединений .

(defn- get-pool
    "Creates Database connection pool to be used in queries"
    [{:keys [host-port db-name username password]}]
    (let [pool (doto (ComboPooledDataSource.)
                   (.setDriverClass "com.mysql.cj.jdbc.Driver")
                   (.setJdbcUrl (str "jdbc:mysql://"
                                     host-port
                                     "/" db-name))
                   (.setUser username)
                   (.setPassword password)
                   ;; expire excess connections after 30 minutes of inactivity:
                   (.setMaxIdleTimeExcessConnections (* 30 60))
                   ;; expire connections after 3 hours of inactivity:
                   (.setMaxIdleTime (* 3 60 60)))]
        {:datasource pool}))


(def pool-db (delay (get-pool db-spec)))


(defn connection [] @pool-db)

; usage in code
(jdbc/query (connection) ["Select SUM(1, 2, 3)"])

Почему мы не можем просто сделать?

(def connection (get-pool db-spec))

; usage in code
(jdbc/query connection ["SELECT SUM(1, 2, 3)"])

Ответы [ 4 ]

0 голосов
/ 19 мая 2019

Я бы предложил вам использовать существующую библиотеку для обработки пула соединений, что-то вроде hikari-cp , которая легко настраивается и работает во многих реализациях SQL.

0 голосов
/ 10 февраля 2019

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

delay запускается, только если вызывается deref, и ничего не делает в противном случае.

0 голосов
/ 10 февраля 2019

Задержка гарантирует, что вы создаете пул соединений при первой попытке его использования, а не при загрузке пространства имен.

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

В общем случае var верхнего уровняопределения должны быть составлены таким образом, чтобы они не могли потерпеть неудачу во время выполнения.

Имейте в виду, что они также могут быть оценены во время процесса компиляции AOT, как указано ниже в примечаниях amalloy.

0 голосов
/ 10 февраля 2019

В вашем приложении вы хотите создать пул всего один раз и использовать его повторно.По этой причине delay используется для переноса метода (get-pool db-spec), так что этот метод будет вызываться только в первый раз, когда он вызывается с помощью deref / @, и кеширует пул, возвращающий егов последующих силовых вызовах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...