在Rails 4.2中设置连接和螺纹尺寸

时间:2015-09-12 00:13:50

标签: ruby-on-rails multithreading activerecord heroku puma

在Puma上运行一个Heroku应用程序,今天早上它在启动后多次抛出错误 -

PG::DuplicatePstatement: ERROR: prepared statement "a10" already exists

这发生在ActiveRecord的postgresql_adapter中,所以我认为from this writeup这是预加载语句的问题以及ActiveRecord如何缓存查询。基本上准备好的声明(a10)已经存在,另一个请求试图创建相同的东西。

深入挖掘,我最好的猜测是,它是启动时分叉进程(例如Puma worker)错误地共享相同连接(?)并尝试相互写入的结果。

该应用看起来像 3名员工,每个 5个线程,db 池大小为2

  1. 这究竟是什么意思?是否意味着有3个工作进程可以产生最多5个线程,并且在所有这些进程中打开(最多)2个db连接?

  2. 如果上述情况属实,那么每个工作人员有5个线程竞争2个连接是不是很糟糕?我可能误解了术语 worker process thread

  3. 的实际定义
  4. 对可能导致错误的原因的任何见解?我是在寻找合适的地方,还是过程连接设置与此处的任何内容都没有关系?

  5. 提前致谢!

    配置/ puma.rb

    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
    

    配置/ database.yml的

    development: &default
      adapter: postgresql
      database: my_db
      encoding: utf8
      host: localhost
      min_messages: warning
      pool: 2
      timeout: 5000
    
    test:
      <<: *default
      database: my_db_test
    

0 个答案:

没有答案