2
我希望能夠在Rails 4應用程序中的不同數據庫模式之間切換。更改連接的線程安全方式search_paths
該計劃是在堆棧的一開始就添加一個新的中間件,這將爲我做到這一點。
唯一的方法就是設置ActiveRecord::Base.connection.schema_search_path = '"$user",my_schema'
。
我遇到的問題是,這個連接將進入池,所有以下請求將使用在第一個中設置的模式(基本上是通過它泄漏)。
因此,我所看到的解決方案是始終將搜索路徑重置爲之前的狀態,並始終將其設置爲每個請求。
但我不想這樣做,因爲:
-
請求的
- 99%會去的默認(
public
)架構,執行set search_path to '$user$,my_schema'
會本來是可以避免的,額外的查詢 - 更高的泄漏風險(其他中間件可能會建立連接,或者對我的控制之外的Rails或Gem進行一些更改)
所有這些特別適用於線程服務器,如Puma。
那麼,有沒有更好的替代方案與我的解決方案與中間件?
謝謝。
這聽起來像Rails的連接池的責任。看起來並不像它實際調用它,因爲連接保留了下列請求中的'search_path'。 –
@DmytriiNagirniak Rails的連接池不夠充足,而且有越野車?不完全是? :p。我想你必須重寫'ConnectionPool.checkin'和/或'ConnectionPool.release_connection'。 –
不知道Rails如何重置連接,但它絕對不會調用DISCARD ALL,請參閱https://github.com/rails/rails/issues/14037 您能否指出使用的文檔/指南RE DISCARD ALL'(與連接池有關)爲上面的Rails問題提供更多信息? –