Ensure ActiveRecord::Base.connection_pool.with_connection creates a new connection only when needed [#1752 state:resolved]

Signed-off-by: Pratik Naik <pratiknaik@gmail.com>
This commit is contained in:
steve 2009-05-01 14:58:10 +01:00 committed by Pratik Naik
parent b193f23390
commit 5501b99a19
2 changed files with 35 additions and 5 deletions

@ -107,13 +107,14 @@ def release_connection
checkin conn if conn
end
# Reserve a connection, and yield it to a block. Ensure the connection is
# checked back in when finished.
# If a connection already exists yield it to the block. If no connection
# exists checkout a connection, yield it to the block, and checkin the
# connection when finished.
def with_connection
conn = checkout
yield conn
fresh_connection = true unless @reserved_connections[current_connection_id]
yield connection
ensure
checkin conn
release_connection if fresh_connection
end
# Returns true if a connection has already been opened.

@ -1,4 +1,6 @@
require "cases/helper"
require "models/project"
require "timeout"
class PooledConnectionsTest < ActiveRecord::TestCase
def setup
@ -89,6 +91,33 @@ def test_undefined_connection_returns_false
ensure
ActiveRecord::Base.connection_handler = old_handler
end
def test_with_connection_nesting_safety
ActiveRecord::Base.establish_connection(@connection.merge({:pool => 1, :wait_timeout => 0.1}))
before_count = Project.count
add_record('one')
ActiveRecord::Base.connection.transaction do
add_record('two')
# Have another thread try to screw up the transaction
Thread.new do
raise ActiveRecord::Rollback
ActiveRecord::Base.connection_pool.release_connection
end.join rescue nil
add_record('three')
end
after_count = Project.count
assert_equal 3, after_count - before_count
end
private
def add_record(name)
ActiveRecord::Base.connection_pool.with_connection { Project.create! :name => name }
end
end unless %w(FrontBase).include? ActiveRecord::Base.connection.adapter_name
class AllowConcurrencyDeprecatedTest < ActiveRecord::TestCase