1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Add synchronization to connection pool also

This commit is contained in:
Nick 2008-04-19 14:42:56 -05:00 committed by Nick Sieger
parent 50cd4bdc99
commit cab76ce6ac
3 changed files with 16 additions and 6 deletions

View file

@ -12,6 +12,9 @@ module ActiveRecord
# The ConnectionSpecification for this pool
@spec = spec
# The mutex used to synchronize pool access
@connection_mutex = Monitor.new
end
def active_connection_name #:nodoc:
@ -70,7 +73,7 @@ module ActiveRecord
# Verify the connection.
conn.verify!(verification_timeout)
else
self.connection = spec
self.set_connection spec
conn = active_connections[name]
end
@ -82,6 +85,7 @@ module ActiveRecord
active_connections[active_connection_name] ? true : false
end
# Disconnect all connections in the pool.
def disconnect!
clear_cache!(@active_connections) do |name, conn|
conn.disconnect!
@ -89,16 +93,20 @@ module ActiveRecord
end
# Set the connection for the class.
def connection=(spec) #:nodoc:
def set_connection(spec) #:nodoc:
if spec.kind_of?(ActiveRecord::ConnectionAdapters::AbstractAdapter)
active_connections[active_connection_name] = spec
elsif spec.kind_of?(ActiveRecord::Base::ConnectionSpecification)
self.connection = ActiveRecord::Base.send(spec.adapter_method, spec.config)
self.set_connection ActiveRecord::Base.send(spec.adapter_method, spec.config)
else
raise ConnectionNotEstablished
end
end
synchronize :active_connection, :connection, :clear_active_connections!,
:clear_reloadable_connections!, :verify_active_connections!, :retrieve_connection,
:connected?, :disconnect!, :set_connection, :with => :@connection_mutex
private
def clear_cache!(cache, &block)
cache.each(&block) if block_given?

View file

@ -27,6 +27,8 @@ module ActiveRecord
@@connection_pools = {}
class << self
# Turning on allow_concurrency basically switches a null mutex for a real one, so that
# multi-threaded access of the connection pools hash is synchronized.
def allow_concurrency=(flag)
if @@allow_concurrency != flag
if flag
@ -37,7 +39,7 @@ module ActiveRecord
end
end
# for internal use only
# for internal use only and for testing
def active_connections #:nodoc:
@@connection_pools.inject({}) do |hash,kv|
hash[kv.first] = kv.last.active_connection

View file

@ -18,7 +18,7 @@ class Module
raise ArgumentError, "Synchronization needs a mutex. Supply an options hash with a :with key as the last argument (e.g. synchronize :hello, :with => :@mutex)."
end
methods.each do |method|
methods.flatten.each do |method|
aliased_method, punctuation = method.to_s.sub(/([?!=])$/, ''), $1
if instance_methods.include?("#{aliased_method}_without_synchronization#{punctuation}")
raise ArgumentError, "#{method} is already synchronized. Double synchronization is not currently supported."
@ -26,7 +26,7 @@ class Module
module_eval(<<-EOS, __FILE__, __LINE__)
def #{aliased_method}_with_synchronization#{punctuation}(*args, &block)
#{with}.synchronize do
#{aliased_method}_without_synchronization#{punctuation}(*args,&block)
#{aliased_method}_without_synchronization#{punctuation}(*args, &block)
end
end
EOS