2012-06-22 17 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