危険な書き方
Thread.new do
puts "#{User.find(1).id}"
end
上記の様にThred.new
の中でDB接続を行っている場合、スレッド毎にDBコネクションが作成されてしまう。
database.ymlのconnection_pool数(デフォルトは5)を超えると以下の様なエラーが発生します。
could not obtain a connection from the pool within 5.000 seconds (waited 5.000 seconds);
all pooled connections were in use (ActiveRecord::ConnectionTimeoutError)
解決策
マルチスレッド内でDBアクセスする場合にDBコネクションを使い回す様に書き直す。
Thread.new do
- puts "#{User.find(1).id}"
+ ActiveRecord::Base.connection_pool.with_connection do
+ puts "#{User.find(1).id}"
+ end
end
参考
http://shirusu-ni-tarazu.hatenablog.jp/entry/2013/07/02/042448
https://easyramble.com/activerecord-with-multi-threads.html