2016-01-04 58 views
6

UPDATE耶索德腳手架部位緩慢釋放數據庫池連接

我已經簡化了的這個示範從腳手架創建一個實際的項目 - 您可以點擊此處查看:https://github.com/tetigi/yesod-bug-test

按照自述設置回購並複製問題!謝謝:)

原帖

我最近一直在嘗試使用耶索德創建一個簡單的網站 - 這是在一個特定的處理程序,它使一對夫婦runDB的電話(選擇並插入一些值了〜 200件數據庫)。但是,在中等負載情況下(例如在瀏覽器中快速重新加載頁面),頁面開始掛起。

做了一些調試,我發現似乎yesod應用程序沒有及時釋放與數據庫池的連接,最終等待它們釋放。爲了correborate此,我發現其他下面的事情:

  • 減小DB池2給了我一個凍結只有一對夫婦的點擊後
  • 默認的5秒左右點擊
  • 後(10)凍結
  • 增加DB池100給了我一個更長的時期點擊,達到約10-15秒快速點擊
  • 的問題是一樣的我是否使用的是Postgres或源碼
  • Postgres裏,這是可能的看到'COMMIT'交易隨着時間堆積起來
  • 這些交易最終會隨着時間消失,網站會再次作出響應

有沒有我在這裏失蹤的東西?該網頁沒有做任何複雜的事情,如下面的代碼片段所示。有任何想法嗎?就目前來看,這個網站對於多個用戶來說是不可用的,直到我找到解決這個問題的方法!

我正在使用通過堆棧的標準腳手架yesod應用程序,如文檔中建議的。

乾杯!

盧克

實例處理程序代碼(有刪節)

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

問題在於內Data.Random - 的東西,如更換choice電話:

import System.Random (randomRIO) 

... 

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

固定的一切,我們不再放慢腳步。不太清楚爲什麼Data.Random會這樣做,但現在至少可以工作!

另一個有趣的事情要注意 - 這個問題不存在於Mac OS X上,只存在於Linux上(CentOS,Arch,Ubuntu是我們嘗試過的)