Fix ActiveRecord using two connection pools when no replica is defined (#27061)

main
Claire 2023-09-22 16:01:59 +02:00 committed by GitHub
parent e824585523
commit 39da3d86f8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 3 deletions

View File

@ -1,11 +1,24 @@
# frozen_string_literal: true # frozen_string_literal: true
module DatabaseHelper module DatabaseHelper
def replica_enabled?
ENV['REPLICA_DB_NAME'] || ENV.fetch('REPLICA_DATABASE_URL', nil)
end
module_function :replica_enabled?
def with_read_replica(&block) def with_read_replica(&block)
ApplicationRecord.connected_to(role: :reading, prevent_writes: true, &block) if replica_enabled?
ApplicationRecord.connected_to(role: :reading, prevent_writes: true, &block)
else
yield
end
end end
def with_primary(&block) def with_primary(&block)
ApplicationRecord.connected_to(role: :writing, &block) if replica_enabled?
ApplicationRecord.connected_to(role: :writing, &block)
else
yield
end
end end
end end

View File

@ -5,7 +5,7 @@ class ApplicationRecord < ActiveRecord::Base
include Remotable include Remotable
connects_to database: { writing: :primary, reading: ENV['REPLICA_DB_NAME'] || ENV['REPLICA_DATABASE_URL'] ? :replica : :primary } connects_to database: { writing: :primary, reading: :replica } if DatabaseHelper.replica_enabled?
class << self class << self
def update_index(_type_name, *_args, &_block) def update_index(_type_name, *_args, &_block)