>假设我的数据库池大小通常为 2,但我想为某些使用线程重现竞争条件的测试增加它,使用如下方法:
def with_db_pool_size(size)
opts = ActiveRecord::Base.configurations.fetch("test")
old_size = opts.fetch("pool")
opts["pool"] = size
#ActiveRecord::Base.connection.disconnect!
ActiveRecord::Base.establish_connection(opts)
yield
ensure
opts["pool"] = old_size
#ActiveRecord::Base.connection.disconnect!
ActiveRecord::Base.establish_connection(opts)
end
这是一种合理的方法吗?请注意注释掉的"断开连接"调用 - 如果我运行这些调用,我遇到了依赖加载的奇怪问题。没有深入调查。
但无论如何,我的心智模型在这里不清楚。如果我像这样使用新选项进行连接,是否会有孤立的连接池?我应该断开连接(并找出导致这些问题的原因)吗?有没有更好的方法?
我尝试在这里和那里输出ActiveRecord::Base.connection_pool.stat
,事情看起来就像我期望的那样——在我第一次连接之前,池的大小是 2,然后是我设置的任何内容,然后在最后连接时再次为 2。我只是不确定这是否会留下连接和/或连接池。
对于这些测试目的来说没什么大不了的,但总的来说,我很想更好地了解 Active Record 连接和线程池。
这并没有直接回答我的问题,但解决了同样的问题。
我找到了涵盖这一点 https://stackoverflow.com/a/43628899/6962。
我将代码更改为
def with_db_pool_size(size)
original_config = ActiveRecord::Base.remove_connection
#p original: ActiveRecord::Base.connection_pool.stat
ActiveRecord::Base.establish_connection(original_config.merge(pool: size))
#p after_est: ActiveRecord::Base.connection_pool.stat
yield
ensure
ActiveRecord::Base.remove_connection
ActiveRecord::Base.establish_connection(original_config)
#p after_ensure: ActiveRecord::Base.connection_pool.stat
end
这似乎正是我们想要的。remove_connection
关闭了旧连接,而不会引起我从直线disconnect!
中看到的问题。
我在上面留下了p
调用——这些调用将显示池按预期更改。