2016-01-13 65 views
1

我可以可靠地使连接池大小小于并行使用ActiveRecord连接的线程数吗?我想线程池的大小是一个。当池大小小于线程数时,避免ConnectionTimeoutError

我得到错误:

could not obtain a database connection within 5.000  
conds (waited 5.000 seconds) ActiveRecord::ConnectionTimeoutError) 

我试着模拟它我的本地机器。但在这里我也面临着同样的错误。

@db_host = "localhost" 
@db_user = "root" 
@db_pass = "root" 
@db_name = "me_dev1" 

ActiveRecord::Base.establish_connection( 
:adapter => "mysql2", 
:host => @db_host, 
:database => @db_name, 
:pool  => 1, 
:reaping_frequency => 1 
) 

class Test < ActiveRecord::Base 
    def create_data 

     100.times do |i| 
     t1=Thread.new { 
     begin 
      test=Test.where(:test_name => "automation test") 
      puts test 
     ensure 
      ActiveRecord::Base.connection.close if ActiveRecord::Base.connection ; 
      ActiveRecord::Base.clear_active_connections! ; 
     end 
    } 
    t1.join 
    end 
    end 
end 

Test.new.create_data 

由于

+0

我冒昧地编辑了您的问题,使标题和问题更具体。如果我错了,导致您的问题不再准确,请您回滚我的编辑? –

回答

1

ActiveRecord的使用为每个线程一个单独的连接。使代码工作的可靠方法是使池的大小大于或等于线程数。

如果您想要的池大小小于线程数,您应该增加ActiveRecord等待从池中获取连接的时间。这是通过checkout_timeout选项完成的,例如:

ActiveRecord::Base.establish_connection( 
    ... 
    checkout_timeout: 3_600, # wait an hour 
)