【问题标题】:jdbc connections in clojure are garbage collected prematurelyclojure 中的 jdbc 连接被过早地收集垃圾
【发布时间】:2019-01-29 09:41:29
【问题描述】:

我正在使用[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 方法中打开连接的堆栈跟踪。

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

【问题讨论】:

  • 您能否更完整地重现该问题?
  • 我添加了额外的代码和信息。

标签: jdbc clojure connection-leaks


【解决方案1】:

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

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

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

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

【讨论】:

  • 这对我不起作用。寻找其他答案。
猜你喜欢
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 2012-01-28
  • 1970-01-01
相关资源
最近更新 更多