[英]Haskell closes connection before reading the data
我編寫了以下程序:
{-# 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的評論,您可能要替換
cur <- db $ M.find $ (M.select [] "bigCollection")
{M.limit = 100000, M.batchSize = 100000}
returnedDocs <- db $ drainCursor cur
通過
returnedDocs <- db $ do
cur <- M.find $ (M.select [] "bigCollection")
{M.limit = 100000, M.batchSize = 100000}
drainCursor cur
我從未使用過mongoDB,但是我很確定數據庫游標僅在創建它的連接中可用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.