说,我有一个简单的应用程序,它使用HDBC与数据库进行交互。它可以是一个快照应用程序或命令行应用程序。我想要一个关于此的通用视图 - 不是快照或任何特定的。 一个很好的例子是“真实世界哈斯克尔”的第22章。
所以我会在一个单独的DB.hs文件中隐藏所有与SQL相关的函数,如connect,saveArticle,getArticle等。所有数据库函数都将连接句柄作为参数。
现在,我将如何启动连接并将其置于一个状态,以便所有这些数据库函数只使用它而无需单独启动连接? 这可能吗?也许我在思考错误或考虑OO概念但是......我想“初始化”我的连接(就像你在OO中初始化一个对象一样)。 我不希望每个数据库功能都创建和关闭新连接。
我是否必须创建一个池并将池作为参数而不是连接句柄传递给函数?这样做最简单的例子是什么?
无论是游泳池还是连接句柄,我如何将其置于一个状态,以便我的功能在需要时抓住它并且不会一直重复“打开”和“关闭”?如果是,它是如何正确完成的?
我是否需要创建一个池并将其置于一个状态,以便函数只查询池以获取来自全局状态的连接?再一次,我会非常感激的例子。
感谢。
答案 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库。