2012-03-23 149 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