[英]How do you open and close a new database connection with ActiveRecord Rails 5
I have some workloads that need to increase WORK_MEM
and TEMP_BUFFERS
. 我有一些工作量需要增加
WORK_MEM
和TEMP_BUFFERS
。 The problem is, once I do this, the connection (session) is not closed and is returned to the pool. 问题是,一旦执行此操作,连接(会话)就不会关闭并返回到池中。 This means the extra memory usage isn't temporary because I can't change
TEMP_BUFFERS
back without destroying the session. 这意味着额外的内存使用不是临时的,因为我不能在不破坏会话的情况下将
TEMP_BUFFERS
改回TEMP_BUFFERS
。
I imagine the workflow going something like this: 我想象工作流程是这样的:
conn = ActiveRecord.create_new_connection
conn.execute <<-SQL
SET TEMP_BUFFERS TO '512MB';
-- do some memory intensive
CREATE TEMPORARY TABLE .....;
UPDATE ....;
SQL
conn.close
Or maybe there is a way to close the current connection and have the pool crate a new one... 或者也许有一种方法可以关闭当前连接,并让池创建一个新的池...
Seems like new_connection
is a private method , which is what we need to manually create a connection outside being part of the pool, 好像
new_connection
是私有方法 ,这是我们需要手动创建的连接的一部分,而该连接不是池的一部分,
Then, upon inspecting the source code, you can do something like this: 然后,在检查源代码后,您可以执行以下操作:
connection_specification = ActiveRecord::Base.connection_pool.spec
# i.e.
# connection_specification.adapter_method == 'postgresql_connection'
# connection_specification.config == {:adapter=>"postgresql", :encoding=>"unicode", :pool=>5, :database=>"someapp_development"}
connection = ActiveRecord::Base.send(
connection_specification.adapter_method,
connection_specification.config
)
# DEBUG:
puts connection.active?
# => true
connection.execute <<-SQL
SET TEMP_BUFFERS TO '512MB';
-- do some memory intensive
CREATE TEMPORARY TABLE .....;
UPDATE ....;
SQL
connection.disconnect!
# DEBUG:
puts connection.active?
# => false
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.