我寫了下面的程序數據之前關閉連接:哈斯克爾閱讀
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE BangPatterns #-}
import Control.Exception (bracket)
import Control.Monad (forM)
import Control.Monad.IO.Class (MonadIO(liftIO))
import Data.List.Split (chunksOf)
import qualified Database.MongoDB as M
import qualified Data.Text as T
db :: M.Action IO a -> IO a
db action = do
pipe <- M.connect (M.host "127.0.0.1")
res <- M.access pipe M.master "haskell" action
M.close pipe
return res
main = do
let docs = (flip map) [0..199999] $ \i ->
["name" M.=: (T.pack $ "name " ++ (show i))]
ids <- forM (chunksOf 50000 docs) $ \chunk ->
db $ M.insertAll "bigCollection" chunk
cur <- db $ M.find $ (M.select [] "bigCollection") {M.limit = 100000, M.batchSize = 100000}
returnedDocs <- db $ drainCursor cur
putStrLn $ show $ length returnedDocs
drainCursor :: M.Cursor -> M.Action IO [M.Document]
drainCursor !cur = drainCursor' cur []
where
drainCursor' cur res = do
batch <- M.nextBatch cur
if null batch
then return res
else drainCursor' cur (res ++ batch)
它插入所有它變成從服務器等待數據卡的數據之後。我認爲這是因爲它在讀取數據之前關閉了連接。我試過BangPatterns和seq功能,支架功能,但沒有成功。它只有在我保持連接打開時纔有效(通過註釋M.close)。有人可以推薦我如何繞過這種情況嗎?
在此先感謝。
我不確定要理解,但似乎您想在數據庫中打開遊標,關閉與數據庫的連接,然後繼續從遊標中獲取數據。如果是這樣,它怎麼可能工作? – chi