在Puma上运行一个Heroku应用程序,今天早上它在启动后多次抛出错误 -
PG::DuplicatePstatement: ERROR: prepared statement "a10" already exists
这发生在ActiveRecord的postgresql_adapter
中,所以我认为from this writeup这是预加载语句的问题以及ActiveRecord如何缓存查询。基本上准备好的声明(a10
)已经存在,另一个请求试图创建相同的东西。
深入挖掘,我最好的猜测是,它是启动时分叉进程(例如Puma worker)错误地共享相同连接(?)并尝试相互写入的结果。
该应用看起来像 3名员工,每个 5个线程,db 池大小为2 。
这究竟是什么意思?是否意味着有3个工作进程可以产生最多5个线程,并且在所有这些进程中打开(最多)2个db连接?
如果上述情况属实,那么每个工作人员有5个线程竞争2个连接是不是很糟糕?我可能误解了术语 worker , process 和 thread
对可能导致错误的原因的任何见解?我是在寻找合适的地方,还是过程连接设置与此处的任何内容都没有关系?
提前致谢!
workers 2
threads_count = 5
threads threads_count, threads_count
preload_app!
rackup DefaultRackup
port ENV["PORT"] || 3000
environment ENV["RACK_ENV"] || "development"
on_worker_boot do
ActiveRecord::Base.establish_connection
end
development: &default
adapter: postgresql
database: my_db
encoding: utf8
host: localhost
min_messages: warning
pool: 2
timeout: 5000
test:
<<: *default
database: my_db_test