How to manage opening and closing database connections while working with activerecords and multiple threads
To prevent connection leak in multi threads, you have to manage the connection manually. You can try:
Thread.new do ActiveRecord::Base.connection_pool.with_connection do # Do whatever endend
One problem of ActiveRecord::Base.connection_pool.with_connection
is that it always prepare a connection even if the code inside does not need it.
We can improve it a little bit by using ActiveRecord::Base.connection_pool.release_connection
:
Thread.new do begin # Do whatever ensure ActiveRecord::Base.connection_pool.release_connection endend
if you want to run in N threads, make sure you have N connections in the pool
# ActiveRecord::Base.connection_config# # => {pool: 5, timeout: 5000, database: "db/development.sqlite3", adapter: "sqlite3"}
otherwise you will be able to fetch a connection from the pool.