gpt4 book ai didi

mysql - 生产环境中的Rails调试

转载 作者:行者123 更新时间:2023-11-29 01:10:47 26 4
gpt4 key购买 nike

我正在创建一个 Twitter 应用程序,每次用户更新页面时,它都会重新加载来自 Twitter 的最新消息并将它们保存到本地数据库,除非它们之前已经创建过。这在开发环境(数据库:sqlite3)中运行良好,但在生产环境(mysql)中它总是再次创建消息,即使它们已经被创建。

消息创建由 twitter_id 检查,每条消息都有:

msg = Message.find_by_twitter_id(message_hash['id'].to_i)
if msg.nil?
# creates new message from message_hash (and possibly new user too)
end
msg.save

显然,在生产环境中,出于某种原因无法通过推特 ID 找到消息(当我查看数据库时,它之前已经正确保存了所有属性)。

通过这么长的介绍,我想我的主要问题是如何调试它? (当然,除非你已经有了主要问题的答案 :) 当我查看 production.log 时,它只显示如下内容:

Processing MainPageController#feeds (for 91.154.7.200 at 2010-01-16 14:35:36) [GET]
Rendering template within layouts/application
Rendering main_page/feeds
Completed in 9774ms (View: 164, DB: 874) | 200 OK [http://www.tweets.vidious.net/]

...但不是数据库请求、logger.debug 文本或任何可以帮助我找到问题的东西。

最佳答案

您可以通过在 config/environment/production.rb 中设置日志级别来更改生产中的日志级别

config.log_level = :debug

这将记录 sql 和您在开发中经常看到的所有其他内容 - 它会稍微降低应用程序的速度,并且您的日志会很大,因此请谨慎使用。

但是至于问题背后的实际问题......

会不会是因为多个连接访问mysql?

如果 twitter 条目尚未提交,那么从另一个连接查询它们将不会返回它们,因此如果在提交之前调用它们的查询,那么您将找不到它们,而是插入再次输入相同的条目。与您单独在 sqlite 上进行测试相比,这种情况更有可能发生在有许多用户的生产环境中。

由于您使用的是 mysql,您可以在 twitter id 上使用唯一键来防止欺骗,然后在您尝试插入欺骗时捕获 ActiveRecord 异常。但这意味着处理一个错误,这不是处理这个问题的好方法(尽管我建议将其作为防止欺骗的后备手段 - mysql 对此很有用,请使用它)。

您还应该防止尝试插入欺骗。一种方法是在公共(public)记录上使用锁,比如所有推文都相关的用户记录,这样另一个进程在获得该锁之前不能尝试为用户添加推文(只有在事务已完成),因此可以防止同时提交相同的信息。

关于mysql - 生产环境中的Rails调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2077770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com