ruby-on-rails-3 - AuthLogic 似乎为一个请求多次更新用户记录

标签 ruby-on-rails-3 session authlogic

对于一个操作请求,我看到大约 6 个计数似乎是 User 模型的 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

最佳答案

我挖掘并找到了一个解决方案:

UserSession.last_request_at_threshold = 10.minutes



据我所知,设置这个的地方 - 在 UserSession 中。 (这也可以在初始化器中设置,如 authlogic.rb)

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

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

更新

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

希望这可以帮助

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

关于ruby-on-rails-3 - AuthLogic 似乎为一个请求多次更新用户记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11164820/

相关文章:

ruby-on-rails-3 - 如何使用 factory_girl 模拟和 stub 事件记录 before_create 回调

javascript - strope.js 和 openfire 谁在页面重新加载时终止连接?

ruby-on-rails - 无法使用 Authlogic 和 Ruby on Rails 使用有效密码登录?

java - 从另一个 EAR 访问本地 session Bean?

ruby-on-rails - 创建 session 时在Authlogic中指定Cookie域

ruby-on-rails - 使用 google 配置 authlogic-oauth

ruby-on-rails-3 - Rails 3 & Strong Parameters,获取质量分配错误

ruby-on-rails - 通过 SendGrid 使用 Ruby on Rails 发送带附件的电子邮件

ruby-on-rails - 特殊字符 & 被打印为 &

php - 在 PHP 中使用 session 和 cookie 创建安全登录