簡體   English   中英

如何從Elixir Ecto檢測數據庫連接問題?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM