【问题标题】:Haskell: HDBC, connection state and possibly poolHaskell:HDBC、连接状态和可能的池
【发布时间】:2012-03-23 01:10:16
【问题描述】:

说,我有一个简单的应用程序,它使用 HDBC 与数据库进行交互。它可以是快照应用程序或命令行应用程序。我想对此有一个通用的看法——不是快照或任何具体的东西。 一个很好的例子是“Real World Haskell”的第 22 章。

所以我会在单独的 DB.hs 文件中隐藏所有与 SQL 相关的函数,例如连接、saveArticle、getArticle 等。所有 DB 函数都将连接句柄作为参数。

现在,我将如何启动一次连接并将其置于一种状态,以便所有这些 DB 函数只使用它而不单独启动连接? 这可能吗?也许我想错了或者考虑到了 OO 概念但是......我想“初始化”我的连接(就像你会在 OO 中初始化一个对象一样)。 我不希望每个 DB 函数都创建和关闭新连接。

我是否必须创建一个池并将该池作为参数而不是连接句柄传递给函数?最简单的例子是什么?

无论是池还是连接句柄,我如何将其置于一种状态,以便我的函数在需要时抓取它,而不是一直重复“打开”和“关闭”?如果是,如何正确完成?

我是否需要创建一个池并将其置于一个状态,以便函数只查询池以获取来自全局状态的连接?再次,非常感谢您的示例。

谢谢。

【问题讨论】:

    标签: haskell


    【解决方案1】:

    没有模块状态或应用程序状态之类的东西,因此您必须找到其他策略。我非常推荐一个 reader monad,环境保持 db 连接。这会在某些功能上花费您一些回报,但会非常可靠。

    下面是一个简单的伪 Haskell 示例。

    type AppState = AppState { dbcon :: DatabaseConnection }
    
    type App = ReaderT AppState IO
    
    main = do
      db <- makeNewDbConnection
      runReaderT getDbTableCount $ AppState db
    
    getDbTableCount :: App Integer
    getDbTableCount = do
      (count:_) <- runDb "select count(*) from table;"
      return $ read count
    
    runDb :: String -> App [String]
    runDb req = do
      con <- asks dbcon
      return $ dbQuery con req
    

    【讨论】:

      【解决方案2】:

      您可能想看看 bos 的 resource-pool 库。

      【讨论】:

      • 是的,这听起来像我需要的:) 是否可以在我的问题中向我展示用法?我似乎无法在网上找到任何示例。另外,我可以把这个资源池放在 MVar 中并传递它吗?谢谢。
      猜你喜欢
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多