3

関数を書きました

app :: Request -> H.Session H.Postgres IO Response

これは、Web 要求を受け入れて応答を作成します (必要に応じてデータベースを調べます)。実際に応答を送信するために、ラッパーを作成しました

runApp :: H.Postgres -> H.SessionSettings -> Application
runApp pg sess req respond =
  respond =<< H.session pg sess (app req)

この関数をWarprunSettingsに渡して、永久にループし、リクエストを処理します。

runSettings appSettings $ runApp pgSettings sessSettings

ただし、接続プールと準備されたステートメントの目的を無効にするすべての要求に対して新しいセッションを作成するため、これは本当に悪いことです。

その逆ではなく、runSettings内側に電話したいと思います。H.sessionただしrunSettings、署名がSettings -> Application -> IO ()あり、中IOに入るとセッションにアクセスできなくなりました。中に戻る方法はありSession b m rますか?

これは、プライベート メールからの質問の再投稿です。

4

1 に答える 1

3

はい、あなたの例では、リクエストごとに新しいセッションを作成しますが、これは受け入れられません。

まず第一にSession、読者モナドのTransformerのエイリアスであり、プールへの直接アクセスを可能にします。したがって、いつでも次のことができます。

session postgresSettings sessionSettings $ do
  -- session' :: H.Session b m r -> m r
  session' <- flip runReaderT <$> ask
  let runApp request respond = 
        respond =<< session' (app request)
  liftIO $ do
    -- run warp here 

次に、同様のパターンを対象としReaderTたインスタンスがあります。MonadBaseControl

于 2014-11-17T15:14:10.290 に答える