2016-01-04 6 views
6

UPDATEイェソド足場サイト私は足場から作成された実際のプロジェクトでこのデモを単純化しているデータベース・プールの接続

を解放するのが遅い - あなたはここでそれをチェックアウトすることができます。https://github.com/tetigi/yesod-bug-test

READMEに従ってくださいレポをセットアップして問題を再現してください。感謝:)

ORIGINAL POST

私は最近イェソドを使用して簡単なウェブサイトを作成しようとしてきた - ある特定のハンドラでは、それは〜runDBのカップルがに(いくつかの値を選択し、挿入呼び出しを行います200項目のDB)。ただし、ブラウザでページをすばやくリロードするなど、中程度の負荷では、ページがハングするようになります。

一部のデバッグを行っているうちに、yesodアプリケーションがDBプールへの接続をタイムリーに解放していないと判断して、リリースを待っていることがわかりました。これをcorreborateするために、私は他の以下のものを見つけました:数回クリックするだけのカップル

  • デフォルト(10)が
  • をクリックするのは約5秒後に凍結した後に2にDBプールを削減

    • は私に凍結を与えました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") 
    

    答えて

    3

    - のようなものでchoiceコールを置き換える:

    import System.Random (randomRIO) 
    
    ... 
    
    -- Pick an entity at random 
    randomInt1 <- liftIO $ randomRIO (0, length entities -1) 
    let Entity _ thisThingEntity = entities !! randomInt1 
    

    固定すべてのものともはや減速することはありません。なぜData.Randomがこれをやっているのか分かりませんが、少なくとも今は動作しています!

    もう1つの興味深い点 - Mac OS XではLinuxの味(CentOS、Arch、Ubuntuは試したもの)で問題が解決しない

    関連する問題