Luminus - 同一数据库连接中的多个请求

时间:2016-05-24 13:10:19

标签: clojure compojure ring luminus

在我的Luminus应用程序中,我有这个:

(defn page1 [id]
  (layout/render "page1.html" 
    {:article (db/get-single-article {:id (Integer/parseInt id)}))

我想在同一个数据库连接中对数据库执行多个不同的请求。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

从您的问题不清楚是否要重用相同的数据库连接来处理多个HTTP请求或使用JDBC API调用多个函数的单个HTTP请求(因此所有这些JDBC调用都使用相同的数据库连接)。

如果是后一种情况,您可以使用with-db-connection来包装调用JDBC API的所有函数。如果所有SQL操作都应该是一个数据库事务的一部分,也可以使用with-db-transaction

对于前一种情况,我不确定为什么你需要为多个HTTP请求重用相同的连接,但它不是一个常见的习惯用法,因为HTTP根据定义是无状态的并且会导致多个问题。

您可以将连接存储在ring HTTP session中,这样只要获得与会话关联的请求并用于JDBC逻辑,就可以获取连接。

然而,这种解决方案有以下缺点:

  • 您必须确保在不再需要时将连接释放到池中(如果不使用池,则关闭)。你怎么会发现这个?如果客户端出现故障并且从未完成您决定清理数据库连接的某个工作流程该怎么办?
  • 您需要处理多少个并发“会话”?如果为每个会话保留专用连接的许多(如数百个)将无法扩展(数据库连接是双方的昂贵资源:客户端和服务器)