5

对于一个操作请求,我看到大约 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
4

1 回答 1

3

我四处寻找并找到了解决方案:

UserSession.last_request_at_threshold = 10.minutes

据我了解设置这个的地方 - 在 UserSession 中。(这也可以在初始化程序中设置,如 authlogic.rb)

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

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

更新

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

希望这可以帮助

PS:这是让我走上正确道路的 q:AuthLogic perishable_token resets on each request

于 2013-12-04T22:31:20.367 回答