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:
parent
50cd4bdc99
commit
cab76ce6ac
3 changed files with 16 additions and 6 deletions
|
@ -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?
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue