簡體   English   中英

Haskell在讀取數據之前關閉連接

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM