Retrieving the connection pool happens a lot, so we cache it in @owner_to_pool.
This makes retrieving the connection pool O(1) once the process is warm.
When a connection is established or removed, we invalidate the cache.
# File activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb, line 960
def retrieve_connection_pool(spec_name)
owner_to_pool.fetch(spec_name) do
# Check if a connection was previously established in an ancestor process,
# which may have been forked.
if ancestor_pool = pool_from_any_process_for(spec_name)
# A connection was established in an ancestor process that must have
# subsequently forked. We can't reuse the connection, but we can copy
# the specification and establish a new connection with it.
establish_connection(ancestor_pool.spec.to_hash).tap do |pool|
pool.schema_cache = ancestor_pool.schema_cache if ancestor_pool.schema_cache
end
else
owner_to_pool[spec_name] = nil
end
end
end