1

我正在使用该[com.impossibl.pgjdbc-ng/pgjdbc-ng "0.7.1"]库连接到 postgres 数据库。连接保存在原子内。然后我像这样武装多个听众:

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

f在这种情况下是事件触发时调用的函数。出于某种原因,连接似乎被垃圾收集了不久,这显然使侦听器无法正常工作。

WARNING: Cleaning up leaked connection ( jdbc:pgsql://my-container/database )

此警告之后是我在arm-listeners方法中打开连接的堆栈跟踪。

我尝试了几件事,例如将连接存储在 a 中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")
4

1 回答 1

0

似乎在let语句中使用连接而不是返回它,有助于 JVM 不收集引用。

所以这样的事情会有所帮助:

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

我会暂时保留这个问题,以防有人有其他答案。

于 2019-01-29T15:12:54.810 回答