gpt4 book ai didi

ruby-on-rails - Rails 3.2 频繁出现 postgres prepared statement already exists 错误

转载 作者:行者123 更新时间:2023-11-29 11:11:00 25 4
gpt4 key购买 nike

我一直在研究 stackoverflow,试图找到其他人得到这些准备好的语句已经存在的错误。

在大多数情况下,使用 after/before fork 正确配置 unicorn 可以解决这些问题。

但是在我的例子中,我们仍然会遇到这样的错误:

ActiveRecord::StatementInvalid: PG::Error: ERROR: prepared statement "a495" already exists: INSERT INTO "user_logins" ("account_id", "created_at", "ip_address", "user_agent", "user_id") VALUES ($1, $2, $3, $4, $5) RETURNING "id"

此错误会在我们应用的不同区域引发,但似乎始终具有相同的语句编号“a495”。

我们在 rails 3.2.17 上,使用 postgres,我们在 heroku 上。

我真的不知道为什么会这样,但它现在开始更频繁地发生了。

如有任何帮助,我们将不胜感激。

在 Rails 堆栈跟踪中,此错误是在 .prepare 调用中抛出的。我很困惑,因为它正在检查语句集合中的 sql 键。如果它不存在,它会准备新的……但是在尝试准备它时,它会抛出错误。

def prepare_statement(sql)
sql_key = sql_key(sql)
unless @statements.key? sql_key
nextkey = @statements.next_key
@connection.prepare nextkey, sql
@statements[sql_key] = nextkey
end
@statements[sql_key]
end

最佳答案

我们遇到了同样的问题,并进行了非常彻底的调查。我们得出结论,在我们的例子中,这个错误是由 Rack::Timeout 引起的,它偶尔会在新语句创建之后但在 Rails 端更新计数器之前中断代码执行。下一个准备好的语句然后尝试使用相同的名称(例如 a494),并且发生了冲突。

我认为 Rails 没有正确实现准备好的语句。他们应该使用 GUID,而不是使用递增计数器(a001a002、...)。这样,上述竞争条件就不是问题了。

我们没有找到解决方法。提高应用程序的性能,并增加 Rack::Timeout 的窗口,使这个问题几乎消失了,但它仍然时有发生。

关于ruby-on-rails - Rails 3.2 频繁出现 postgres prepared statement already exists 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24458105/

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