簡體   English   中英

在遞歸函數中,rails打開了多少個連接?

[英]How many connections does rails open in a recursive function?

我有一個模型,它有一個自己的遞歸鏈接,如鏈接列表。 如果我正在編寫類似下面的函數(請原諒我的語法,Ruby不是我選擇的語言)來跟隨鏈到最后。 假設這是Active Record模型的一部分, next是下一個節點的外鍵,那么這個函數的幕后會發生什么? 與我的MySQL數據庫有多少單獨的連接是Active Record打開,它們需要多長時間?

module LinkedList
  class Node < ActiveRecord::Base

    has_one :value
    has_one :next, foreign_key: 'id' class_name: 'Source::Incident'

    def fetch_all_nodes(current_node=nil, all_nodes=nil)

      current_node = current_node ? current_node : self
      all_nodes = all_nodes ? all_nodes : [self]

      if current_node.next
        all_nodes = fetch_all_nodes(current_node.next, all_nodes << current_node)

      all_nodes
   end
 end
end

作為遞歸函數編寫,您將為每個節點調用一次SQL調用。 調用Next,獲取相關節點,並緩存該值。 (如果需要,您可以重新加載它)。 據我所知,這個實現最終會產生每個數據庫記錄的單個對象。 如果您最終查找已存儲的對象,這將導致更多對象和更多數據庫查找,但Rails具有查詢緩存,因此可以減少此類查找。

您可以讓all_nodes返回一個惰性枚舉器 ,然后如果您最終沒有檢查整個尾部,那么每個訪問的節點只能有一個調用,並且您可以處理可能無限(甚至是循環)的列表。

ActiveRecord使用ActiveRecord::ConnectionAdapters::ConnectionPool連接到您的數據存儲區,該數據存儲區具有5個連接的默認池。 因此,最多每個Rails / ActiveRecord實例將使用最大數量的數據庫連接作為配置的連接池大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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