AuthLogic似乎为一个请求多次更新用户记录

时间:2012-06-22 22:14:14

标签: ruby-on-rails-3 session authlogic

对于一个操作请求,我看到了6个用户模型似乎与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

1 个答案:

答案 0 :(得分:3)

我挖了一圈,找到了解决方案:

  

UserSession.last_request_at_threshold = 10.minutes

据我了解设置此位置的地方 - 在UserSession中。 (这也可以在initalizer中设置,如authlogic.rb)

有多个更新的原因是它会更新last_request_at 每次时间对current_user进行某种检查。例如,当您为某种工作流程使用登录状态时 - 即仅为登录的用户显示菜单项或页面的一部分。

将last_request_at设置为更大的阈值后,您将摆脱这些更新。对我来说,摆脱了大约10个更新语句 - 每个大约需要0.5毫秒 - 不是很大,但考虑到我有100个用户(内部应用程序) - 一直使用这个应用程序,我不需要跟踪他们的最后一次请求(他们要么在建筑物内还是没有),我可以限制它,甚至完全停止跟踪它 - 在一天中,我不需要对数据库进行数十万次额外更新 - 并使阅读日志更容易。

<强>更新

即使您将其设置为仅1秒 - 这仍然有用 - 因为现在它只会更新一次请求(假设您的应用程序没有超过一秒的请求 - 如果您这样做可能是另一个问题的标志)即使你在同一个请求中多次检查current_user。我怀疑有没有人可以在同一秒内做多个不同的请求。

希望这有帮助

P.S。:这是让我走上正确道路的q:AuthLogic perishable_token resets on every request

相关问题