2012-03-23 57 views
6

说,我有一个简单的应用程序,它使用HDBC与数据库进行交互。它可能是一个快照应用程序或命令行应用程序。我想就此提供一个通用的观点 - 不是快照或任何特定的。 一个很好的例子是来自“真实世界Haskell”的第22章。Haskell:HDBC,连接状态和可能的池

所以我就躲在像连接,saveArticle,getArticle等在一个单独的DB.hs文件中的所有我的SQL相关的功能。所有的DB函数都会将连接句柄作为参数。

现在,我怎么会发起一次连接,并把它的状态,使所有这些功能DB只使用它没有单独发起连接? 这可能吗?也许我在思考错误或在脑海中的概念,但...我想“初始化”我的连接(就像你将初始化一个OO对象)。 我不希望每个DB函数都创建并关闭新的连接。

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

无论是游泳池或连接手柄,我怎么把它的状态,所以我只是功能抓住它,在需要的时候,不重复“打开”和“关闭”所有的时间?如果是的话,它是如何正确完成的?

我需要创建一个池,并把它的状态等等功能,只是查询全球状态的连接池?再次,示例将非常感激。

谢谢。

回答

1

你可能想看看bos'resource-pool库。

+0

是的,这听起来像我所需要的:)是否有可能在我的问题中显示我的用法?我似乎无法在网上找到任何例子。另外,我可以坚持这MVAR MVA并将其传递?谢谢。 – 2012-03-25 03:13:36

2

没有模块状态或应用程序状态这样的事情,所以你必须找到其他策略。我非常推荐阅读器monad,在环境中持有db连接。这会在一些功能上花费你一些回报,但会非常稳固。

下面是一个简单的伪哈斯克尔例子。

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