2012-06-22 23 views
4

對於一個操作請求,我會看到大概6個用於User模型的似乎是AuthLogic相關記錄更新的計數。我想知道這是否正常,或者是否有其他人遇到過這個問題,我該怎麼辦。我仍然試圖追查這個原因,但我高度懷疑它與AuthLogic有關。對於一個請求,AuthLogic似乎多次更新用戶記錄

正如您所看到的,對記錄的更新非常緩慢,並且在一個請求內發生所有這些更新令人擔憂!

SQL (0.1ms) BEGIN 
    AREL (0.6ms) UPDATE `users` SET `last_request_at` = '2012-06-22 22:02:43', `perishable_token` = 'rGvsUjfDYw4lrFk6bYJu', `updated_at` = '2012-06-22 22:02:43' WHERE `users`.`id` = 6697 
    SQL (91.8ms) COMMIT 
    User Load (0.7ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 6697 LIMIT 1 
    SQL (0.2ms) BEGIN 
    AREL (0.5ms) UPDATE `users` SET `last_request_at` = '2012-06-22 22:02:43', `perishable_token` = 'CHSKWhMmNHB5h8HeAWI', `updated_at` = '2012-06-22 22:02:43' WHERE `users`.`id` = 6697 
    SQL (43.2ms) COMMIT 
    User Load (0.7ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 6697 LIMIT 1 
    SQL (0.2ms) BEGIN 
    AREL (0.5ms) UPDATE `users` SET `last_request_at` = '2012-06-22 22:02:44', `perishable_token` = 'yDEGFCy4JrKrLVOKhwP', `updated_at` = '2012-06-22 22:02:44' WHERE `users`.`id` = 6697 
    SQL (43.4ms) COMMIT 

User Load (0.7ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 6697 LIMIT 1 
    SQL (0.1ms) BEGIN 
    AREL (0.3ms) UPDATE `users` SET `last_request_at` = '2012-06-22 22:02:44', `perishable_token` = 'TSrzZCKL2C0R5BPJAkVA', `updated_at` = '2012-06-22 22:02:44' WHERE `users`.`id` = 6697 
    SQL (36.6ms) COMMIT 
    User Load (0.7ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 6697 LIMIT 1 
    SQL (0.1ms) BEGIN 
    AREL (0.3ms) UPDATE `users` SET `last_request_at` = '2012-06-22 22:02:44', `perishable_token` = 'hfRuoHYvIQZCdd8obtA', `updated_at` = '2012-06-22 22:02:44' WHERE `users`.`id` = 6697 
    SQL (38.4ms) COMMIT 
+0

你已經找到了原因是什麼?我看到了同樣的問題。 – konung

回答

2

我挖了一圈,發現一個解決方案:

UserSession.last_request_at_threshold = 10.minutes

據我瞭解設置這個地方 - 在UserSession。 (這可以在initalizer中設置,就像authlogic.rb一樣)

有多個更新的原因是它更新last_request_at 每一個當你對current_user進行某種檢查時。例如,當您對某種工作流程使用登錄狀態時 - 即僅顯示登錄用戶的菜單項或頁面部分。

將last_request_at設置爲較大的閾值後 - 即可擺脫這些更新。對我來說,擺脫大約10個更新聲明 - 每個都花了大約0.5毫秒 - 不是一個很大的他,但考慮到我有100個用戶(內部應用程序) - 始終使用此應用程序,我不需要跟蹤他們最後的請求(他們要麼在大樓裏,要麼不在),我可以限制它甚至完全停止跟蹤它 - 在一天的過程中,對數據庫的數千次額外更新我不需要做 - 並使閱讀日誌更容易。

UPDATE

即使你把它設置爲只需1秒 - 這將幫助還是 - 因爲現在它只會每個請求更新一次(假設你的應用程序不具有采取比較長的請求第二 - 如果你這樣做可能是另一個問題的標誌)即使你在同一個請求中多次檢查current_user。我懷疑有沒有人能夠在同一秒內完成多種不同的請求。

希望這有助於

P.S:這裏是我開始在正確的道路上Q:AuthLogic perishable_token resets on every request