Haskell:HDBC,连接状态和可能的池

时间:2012-03-23 01:10:17

标签: haskell

说,我有一个简单的应用程序,它使用HDBC与数据库进行交互。它可以是一个快照应用程序或命令行应用程序。我想要一个关于此的通用视图 - 不是快照或任何特定的。 一个很好的例子是“真实世界哈斯克尔”的第22章。

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

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

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

无论是游泳池还是连接句柄,我如何将其置于一个状态,以便我的功能在需要时抓住它并且不会一直重复“打开”和“关闭”?如果是,它是如何正确完成的?

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

感谢。

2 个答案:

答案 0 :(得分:2)

没有模块状态或应用程序状态,因此您必须找到其他策略。我非常推荐一个读者monad,环境保持数据库连接。在某些功能中,这将花费你一些回报,但会非常稳固。

下面是一个简单的伪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

答案 1 :(得分:1)

您可能需要查看bos'resource-pool库。