UPDATEイェソド足場サイト私は足場から作成された実際のプロジェクトでこのデモを単純化しているデータベース・プールの接続
を解放するのが遅い - あなたはここでそれをチェックアウトすることができます。https://github.com/tetigi/yesod-bug-test
READMEに従ってくださいレポをセットアップして問題を再現してください。感謝:)
ORIGINAL POST
私は最近イェソドを使用して簡単なウェブサイトを作成しようとしてきた - ある特定のハンドラでは、それは〜runDBのカップルがに(いくつかの値を選択し、挿入呼び出しを行います200項目のDB)。ただし、ブラウザでページをすばやくリロードするなど、中程度の負荷では、ページがハングするようになります。
一部のデバッグを行っているうちに、yesodアプリケーションがDBプールへの接続をタイムリーに解放していないと判断して、リリースを待っていることがわかりました。これをcorreborateするために、私は他の以下のものを見つけました:数回クリックするだけのカップル
- は私に凍結を与えました100にDBプールを増やす
- が、私はpostgresのではpostgresのかsqliteの
- を使用しているかどうか、私ははるかに長い問題は同じである迅速なクリック
- 約10〜15秒まで、期間をクリックした、それが可能でした時間の経過と共に積み重なる 'COMMIT'トランザクションを確認する
- これらの取引は時間の経過とともに消滅し、ウェブサイトは再び反応します
ここに何か不足しているものがありますか?以下のスニペットが表示されるので、ウェブページは何も複雑ではありません。何か案は?それを修正する方法が見つかるまで、それは複数のユーザーにとってウェブサイトは使用できなくなります。
ドキュメントで推奨されているように、スタックを介して標準的なスキャフォールドのyesodアプリケーションを使用しています。
乾杯!
問題がData.Random内にあるルーク
例ハンドラコード(簡略)
getCompareR :: Handler Html
getCompareR = do
-- Get all entities from the db. Throws error if < 2 elems in the DB.
entities <- fmap (\xs -> assert (length xs >= 2) xs) $ runDB $ selectList [] []
-- Pick an entity at random
Entity _ thisThingEntity <- liftIO $ runRVar (choice entities) DevRandom
-- Pull out everything NOT the thing we just picked
otherEntities <- runDB $ selectList [ComparisonHash !=. (comparisonHash thisThingEntity)] []
-- Pick one at random
Entity _ thatThingEntity <- liftIO $ runRVar (choice otherEntities) DevRandom
-- Some stuff including some inserts
-- ...
-- ...
runDB $ sequence [update thisId [ComparisonElo =. thisElo], update thatId [ComparisonElo =. thatElo]]
-- Start laying out the webpage
defaultLayout $ do
-- Fill in the rest with compare.hamlet
$(widgetFile "compare")