提交 10ed7f58 编写于 作者: H Heinrich Lee Yu

Fix query cache when using shared connections

Enables the query cache on the correct connection when
shared connections across threads are enabled
上级 7d699dad
......@@ -426,7 +426,7 @@ def lock_thread=(lock_thread)
# #connection can be called any number of times; the connection is
# held in a cache keyed by a thread.
def connection
@thread_cached_conns[connection_cache_key(@lock_thread || Thread.current)] ||= checkout
@thread_cached_conns[connection_cache_key(current_thread)] ||= checkout
end
# Returns true if there is an open connection being used for the current thread.
......@@ -435,7 +435,7 @@ def connection
# #connection or #with_connection methods. Connections obtained through
# #checkout will not be detected by #active_connection?
def active_connection?
@thread_cached_conns[connection_cache_key(Thread.current)]
@thread_cached_conns[connection_cache_key(current_thread)]
end
# Signal that the thread is finished with the current connection.
......@@ -730,6 +730,10 @@ def connection_cache_key(thread)
thread
end
def current_thread
@lock_thread || Thread.current
end
# Take control of all existing connections so a "group" action such as
# reload/disconnect can be performed safely. It is no longer enough to
# wrap it in +synchronize+ because some pool's actions are allowed
......
......@@ -33,17 +33,17 @@ def initialize(*)
end
def enable_query_cache!
@query_cache_enabled[connection_cache_key(Thread.current)] = true
@query_cache_enabled[connection_cache_key(current_thread)] = true
connection.enable_query_cache! if active_connection?
end
def disable_query_cache!
@query_cache_enabled.delete connection_cache_key(Thread.current)
@query_cache_enabled.delete connection_cache_key(current_thread)
connection.disable_query_cache! if active_connection?
end
def query_cache_enabled
@query_cache_enabled[connection_cache_key(Thread.current)]
@query_cache_enabled[connection_cache_key(current_thread)]
end
end
......
......@@ -536,6 +536,23 @@ def test_clear_query_cache_is_called_on_all_connections
ActiveRecord::Base.connection_handlers = { writing: ActiveRecord::Base.default_connection_handler }
end
test "query cache is enabled in threads with shared connection" do
ActiveRecord::Base.connection_pool.lock_thread = true
assert_cache :off
thread_a = Thread.new do
middleware { |env|
assert_cache :clean
[200, {}, nil]
}.call({})
end
thread_a.join
ActiveRecord::Base.connection_pool.lock_thread = false
end
private
def with_temporary_connection_pool
old_pool = ActiveRecord::Base.connection_handler.retrieve_connection_pool(ActiveRecord::Base.connection_specification_name)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册