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")