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。

那麼,有沒有更好的替代方案與我的解決方案與中間件?

謝謝。

回答

2

將連接返回到池時,必須確保池運行DISCARD ALL;以重置連接狀態。

這將清除任何SET ROLESET SESSION AUTHORIZATION,會話變量,search_path設置等

+0

這聽起來像Rails的連接池的責任。看起來並不像它實際調用它,因爲連接保留了下列請求中的'search_path'。 –

+0

@DmytriiNagirniak Rails的連接池不夠充足,而且有越野車?不完全是? :p。我想你必須重寫'ConnectionPool.checkin'和/或'ConnectionPool.release_connection'。 –

+0

不知道Rails如何重置連接,但它絕對不會調用DISCARD ALL,請參閱https://github.com/rails/rails/issues/14037 您能否指出使用的文檔/指南RE DISCARD ALL'(與連接池有關)爲上面的Rails問題提供更多信息? –