jdbc-соединения в clojure преждевременно собирают мусор - PullRequest
0 голосов
/ 29 января 2019

Я использую библиотеку [com.impossibl.pgjdbc-ng/pgjdbc-ng "0.7.1"] для подключения к базе данных postgres.Связь сохраняется внутри атома.Затем я включаю несколько слушателей так:

(doto (.createStatement (connection f))
    (.execute (format "LISTEN %s;" event))
    (.closeOnCompletion)))

f, в этом случае это функция, вызываемая при срабатывании события.По какой-то причине это не займет много времени, пока соединение не будет похоже на сборщик мусора, что, очевидно, приводит к тому, что слушатели не работают.arm-listeners method.

Я пробовал несколько вещей, например, сохранял соединение в let, но, похоже, ни одна из них не помогла с этой конкретной проблемой.

Полная функция для установления соединения и запуска прослушивателя, которую я использую, такова: https://github.com/n2o/postgres-listener/blob/master/src/postgres_listener/core.clj

Вот как я запускаю прослушиватели:

(defn start-listeners
  "Start all important listeners."
  []
  (connect {:host (System/getenv "DB_HOST")
            :port (read-string (System/getenv "DB_PORT"))
            :database (System/getenv "DB_NAME")
            :user (System/getenv "DB_USER")
            :password (System/getenv "DB_PW")})
  (arm-listener handle-textversions "textversions_changes")
  (arm-listener handle-statements "statements_changes")
  (arm-listener handle-arguments "arguments_changes")

1 Ответ

0 голосов
/ 29 января 2019

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

Так что-то вроде этого поможет:

(let [conn (connect <...>)
      a (arm-listener f name)]
   conn)

Я пока оставлю вопрос открытым, если у кого-то будет другой ответ.

...