mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Fixed that each request with the WEBrick adapter would open a new database connection #1685 [Sam Stephenson]. Added ActiveRecord::Base.threaded_connections flag to turn off 1-connection per thread (required for thread safety). By default it's on, but WEBrick in Rails need it off #1685 [Sam Stephenson]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1792 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
e008bfd2d8
commit
60499774c2
7 changed files with 58 additions and 8 deletions
|
@ -1,5 +1,7 @@
|
|||
*SVN*
|
||||
|
||||
* Added ActiveRecord::Base.threaded_connections flag to turn off 1-connection per thread (required for thread safety). By default it's on, but WEBrick in Rails need it off #1685 [Sam Stephenson]
|
||||
|
||||
* Correct reflected table name for singular associations. #1688 [court3nay@gmail.com]
|
||||
|
||||
* Fixed optimistic locking with SQL Server #1660 [tom@popdog.net]
|
||||
|
|
|
@ -289,6 +289,11 @@ module ActiveRecord #:nodoc:
|
|||
# This is set to :local by default.
|
||||
cattr_accessor :default_timezone
|
||||
@@default_timezone = :local
|
||||
|
||||
# Determines whether or not to use a connection for each thread, or a single shared connection for all threads.
|
||||
# Defaults to true; Railties' WEBrick server sets this to false.
|
||||
cattr_accessor :threaded_connections
|
||||
@@threaded_connections = true
|
||||
|
||||
class << self # Class methods
|
||||
# Find operates with three different retreval approaches:
|
||||
|
|
|
@ -86,6 +86,14 @@ module ActiveRecord
|
|||
end
|
||||
end
|
||||
|
||||
def self.active_connections #:nodoc:
|
||||
if threaded_connections
|
||||
Thread.current['active_connections'] ||= {}
|
||||
else
|
||||
@@active_connections ||= {}
|
||||
end
|
||||
end
|
||||
|
||||
# Locate the connection of the nearest super class. This can be an
|
||||
# active or defined connections: if it is the latter, it will be
|
||||
# opened and set as the active connection for the class it was defined
|
||||
|
@ -94,7 +102,7 @@ module ActiveRecord
|
|||
klass = self
|
||||
ar_super = ActiveRecord::Base.superclass
|
||||
until klass == ar_super
|
||||
if conn = (Thread.current['active_connections'] ||= {})[klass]
|
||||
if conn = active_connections[klass]
|
||||
return conn
|
||||
elsif conn = @@defined_connections[klass]
|
||||
klass.connection = conn
|
||||
|
@ -109,7 +117,7 @@ module ActiveRecord
|
|||
def self.connected?
|
||||
klass = self
|
||||
until klass == ActiveRecord::Base.superclass
|
||||
if Thread.current['active_connections'].is_a?(Hash) && Thread.current['active_connections'][klass]
|
||||
if active_connections[klass]
|
||||
return true
|
||||
else
|
||||
klass = klass.superclass
|
||||
|
@ -125,8 +133,7 @@ module ActiveRecord
|
|||
def self.remove_connection(klass=self)
|
||||
conn = @@defined_connections[klass]
|
||||
@@defined_connections.delete(klass)
|
||||
Thread.current['active_connections'] ||= {}
|
||||
Thread.current['active_connections'][klass] = nil
|
||||
active_connections[klass] = nil
|
||||
conn.config if conn
|
||||
end
|
||||
|
||||
|
@ -134,8 +141,7 @@ module ActiveRecord
|
|||
def self.connection=(spec)
|
||||
raise ConnectionNotEstablished unless spec
|
||||
conn = self.send(spec.adapter_method, spec.config)
|
||||
Thread.current['active_connections'] ||= {}
|
||||
Thread.current['active_connections'][self] = conn
|
||||
active_connections[self] = conn
|
||||
end
|
||||
|
||||
# Converts all strings in a hash to symbols.
|
||||
|
|
|
@ -51,8 +51,7 @@ module ActiveRecord
|
|||
QueryCache.new(self.send(spec.adapter_method, spec.config)) :
|
||||
self.send(spec.adapter_method, spec.config)
|
||||
|
||||
Thread.current['active_connections'] ||= {}
|
||||
Thread.current['active_connections'][self] = conn
|
||||
active_connections[self] = conn
|
||||
end
|
||||
end
|
||||
|
||||
|
|
34
activerecord/test/threaded_connections_test.rb
Normal file
34
activerecord/test/threaded_connections_test.rb
Normal file
|
@ -0,0 +1,34 @@
|
|||
require 'abstract_unit'
|
||||
|
||||
class ThreadedConnectionsTest < Test::Unit::TestCase
|
||||
self.use_transactional_fixtures = false
|
||||
|
||||
fixtures :topics
|
||||
|
||||
def setup
|
||||
@connection = ActiveRecord::Base.remove_connection
|
||||
@connections = []
|
||||
end
|
||||
|
||||
def gather_connections(use_threaded_connections)
|
||||
ActiveRecord::Base.threaded_connections = use_threaded_connections
|
||||
ActiveRecord::Base.establish_connection(@connection)
|
||||
|
||||
5.times do
|
||||
Thread.new do
|
||||
Topic.find :first
|
||||
@connections << ActiveRecord::Base.active_connections.values.first
|
||||
end.join
|
||||
end
|
||||
end
|
||||
|
||||
def test_threaded_connections
|
||||
gather_connections(true)
|
||||
assert_equal @connections.uniq.length, 5
|
||||
end
|
||||
|
||||
def test_unthreaded_connections
|
||||
gather_connections(false)
|
||||
assert_equal @connections.uniq.length, 1
|
||||
end
|
||||
end
|
|
@ -1,5 +1,7 @@
|
|||
*SVN*
|
||||
|
||||
* Fixed that each request with the WEBrick adapter would open a new database connection #1685 [Sam Stephenson]
|
||||
|
||||
* Added support for SQL Server in the database rake tasks #1652 [ken.barker@gmail.com] Note: osql and scptxfr may need to be installed on your development environment. This involves getting the .exes and a .rll (scptxfr) from a production SQL Server (not developer level SQL Server). Add their location to your Environment PATH and you are all set.
|
||||
|
||||
* Added a VERSION parameter to the migrate task that allows you to do "rake migrate VERSION=34" to migrate to the 34th version traveling up or down depending on the current version
|
||||
|
|
|
@ -8,6 +8,8 @@ include WEBrick
|
|||
|
||||
ABSOLUTE_RAILS_ROOT = File.expand_path(RAILS_ROOT)
|
||||
|
||||
ActiveRecord::Base.threaded_connections = false
|
||||
|
||||
class CGI
|
||||
def stdinput
|
||||
@stdin || $stdin
|
||||
|
|
Loading…
Reference in a new issue