Have some simple way to create connection pool
This commit is contained in:
parent
79e8e6134f
commit
136dc79433
|
|
@ -69,6 +69,30 @@ module Gitlab
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.with_connection_pool(pool_size)
|
||||||
|
pool = create_connection_pool(pool_size)
|
||||||
|
|
||||||
|
yield(pool)
|
||||||
|
|
||||||
|
ensure
|
||||||
|
pool.disconnect!
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.create_connection_pool(pool_size)
|
||||||
|
# See activerecord-4.2.7.1/lib/active_record/connection_adapters/connection_specification.rb
|
||||||
|
env = Rails.env
|
||||||
|
original_config = ActiveRecord::Base.configurations
|
||||||
|
env_config = original_config[env].merge('pool' => pool_size)
|
||||||
|
config = original_config.merge(env => env_config)
|
||||||
|
|
||||||
|
spec =
|
||||||
|
ActiveRecord::
|
||||||
|
ConnectionAdapters::
|
||||||
|
ConnectionSpecification::Resolver.new(config).spec(env.to_sym)
|
||||||
|
|
||||||
|
ActiveRecord::ConnectionAdapters::ConnectionPool.new(spec)
|
||||||
|
end
|
||||||
|
|
||||||
def self.connection
|
def self.connection
|
||||||
ActiveRecord::Base.connection
|
ActiveRecord::Base.connection
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -71,6 +71,54 @@ describe Gitlab::Database, lib: true do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '.with_connection_pool' do
|
||||||
|
it 'creates a new connection pool and disconnect it after used' do
|
||||||
|
closed_pool = nil
|
||||||
|
|
||||||
|
described_class.with_connection_pool(1) do |pool|
|
||||||
|
pool.with_connection do |connection|
|
||||||
|
connection.execute('SELECT 1 AS value')
|
||||||
|
end
|
||||||
|
|
||||||
|
expect(pool).to be_connected
|
||||||
|
|
||||||
|
closed_pool = pool
|
||||||
|
end
|
||||||
|
|
||||||
|
expect(closed_pool).not_to be_connected
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'disconnects the pool even an exception was raised' do
|
||||||
|
error = Class.new(RuntimeError)
|
||||||
|
closed_pool = nil
|
||||||
|
|
||||||
|
begin
|
||||||
|
described_class.with_connection_pool(1) do |pool|
|
||||||
|
pool.with_connection do |connection|
|
||||||
|
connection.execute('SELECT 1 AS value')
|
||||||
|
end
|
||||||
|
|
||||||
|
closed_pool = pool
|
||||||
|
|
||||||
|
raise error.new('boom')
|
||||||
|
end
|
||||||
|
rescue error
|
||||||
|
end
|
||||||
|
|
||||||
|
expect(closed_pool).not_to be_connected
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '.create_connection_pool' do
|
||||||
|
it 'creates a new connection pool with specific pool size' do
|
||||||
|
pool = described_class.create_connection_pool(5)
|
||||||
|
|
||||||
|
expect(pool)
|
||||||
|
.to be_kind_of(ActiveRecord::ConnectionAdapters::ConnectionPool)
|
||||||
|
expect(pool.spec.config[:pool]).to eq(5)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '#true_value' do
|
describe '#true_value' do
|
||||||
it 'returns correct value for PostgreSQL' do
|
it 'returns correct value for PostgreSQL' do
|
||||||
expect(described_class).to receive(:postgresql?).and_return(true)
|
expect(described_class).to receive(:postgresql?).and_return(true)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue