【问题标题】:Luminus -- multiple requests within the same db connectionLuminus——同一个数据库连接中的多个请求
【发布时间】:2016-09-21 17:31:17
【问题描述】:
在我的 Luminus 应用中,我有这个:
(defn page1 [id]
(layout/render "page1.html"
{:article (db/get-single-article {:id (Integer/parseInt id)}))
我想在同一个数据库连接中对数据库执行多个不同的请求。我该怎么做?
【问题讨论】:
标签:
clojure
compojure
ring
luminus
【解决方案1】:
根据您的问题,不清楚您是要重用相同的数据库连接来处理多个 HTTP 请求还是使用 JDBC API 调用多个函数的单个 HTTP 请求(因此所有这些 JDBC 调用都使用相同的数据库连接)。
如果是后一种情况,您可以使用with-db-connection 包装所有调用 JDBC API 的函数。如果所有 SQL 操作都应该是一个 DB 事务的一部分,您也可以使用 with-db-transaction。
对于前一种情况,我不确定为什么您需要为多个 HTTP 请求重用相同的连接,但这不是一个常见的习惯用法,因为 HTTP 根据定义是无状态的并且会导致多个问题。
您可以将连接存储在您的ring HTTP session 中,以便在收到与会话关联的请求并用于 JDBC 逻辑时获取它。
但是,这样的解决方案有以下缺点:
- 您必须确保在不再需要连接时将连接释放到池中(如果您不使用池,则将其关闭)。你将如何检测到这一点?如果客户端失败并且从未完成您决定清理数据库连接的某些工作流怎么办?
- 您需要处理多少个并发“会话”?如果许多(如数百个)为每个会话保持专用连接无法扩展(数据库连接在双方都是昂贵的资源:客户端和服务器)