[英]How do I detect database connection issues from Elixir Ecto?
我正在編寫一個通過Ecto連接到Postgres數據庫的Elixir項目。 數據庫服務器與應用程序本身位於不同的服務器上,並且與在相同硬件上運行相比,數據庫服務器更容易遭受中斷,這些中斷不會影響Elixir項目。
當應用程序正常啟動時,數據庫連接似乎會自動建立,並且一切正常。 但是,如果出現連接錯誤,Ecto只會將任何錯誤噴入日志中。
我想做的是檢測當前的連接狀態,並通過一條簡單的Plug路由將該信息報告給外部負載均衡器,以便可以將流量路由到具有活動連接的單獨服務器。
問題是,除了聽日志之外,我不確定如何確定Ecto是否與數據庫建立了可行的連接,該日志隨后沒有報告數據庫連接已恢復。
我可以調用什么來確定Ecto連接是否處於活動狀態並且可用,最好不要對該連接進行無操作查詢?
要檢測到數據庫的連接是否實時可用,您可以嘗試使用:gen_tcp.connect/3
直接在Ecto外部進行連接。 代碼看起來像這樣:
case :gen_tcp.connect('127.0.0.1', 5432, []) do
{:ok, _} ->
# code for handling ok scenario
{:error, error} ->
# code for handling error scenario. Typically, you'll get the econnrefused error when the server is down
end
請注意,Ecto通過您為其設置的Mix配置獲取要連接的服務器的詳細信息。 如果要更改連接的服務器,則必須運行Application.put_env/4
,然后重新啟動Ecto存儲庫,以便Ecto識別新的配置。 例如:
Application.put_env(:my_app, MyApp.Repo, [adapter: Ecto.Adapters.Postgres, username: "postgres", password: "postgres",database: "new_db", hostname: "different_host.com", pool_size: 20])
Supervisor.stop(MyApp.Repo)
Ecto只是將任何錯誤噴入日志。
這是啟用連接backoff
的默認策略。 您可以通過在回購選項backoff_type
設置為:stop
來禁用回退,並自己處理錯誤。
我可以調用什么來確定Ecto連接是否處於活動狀態並且可用,最好不要對該連接進行無操作查詢?
我認為您只能通過使用它來檢查連接是否“可用” :)
try do
Ecto.Adapters.SQL.query(MyApp.Repo, "SELECT 1")
rescue
e in DBConnection.ConnectionError -> :down
end
順便說一句,上述模塊是用於連接的默認池模塊 ,您可以依賴其內部(不需要)並手動進行簽出。 可以實現自己的池,而不是這個池:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.