递归函数中的导轨打开了多少个连接?

时间:2019-03-21 22:47:08

标签: ruby-on-rails

我有一个自身具有递归链接的模型,例如链表。如果我正在编写如下所示的函数(请原谅我的语法,那么Ruby不是我选择的语言),将其遵循到最后。假设这是Active Record模型的一部分,并且next是下一个节点的外键,那么此功能在幕后会发生什么? Active Record正在打开与我的MySQL数据库的多少个单独的连接,它们会停留多长时间?

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

2 个答案:

答案 0 :(得分:0)

作为递归函数编写,每个节点将有一个调用SQL调用。下一步被调用,获取相关节点,并缓存该值。 (您可以根据需要重新加载它)。据我所知,该实现最终在每个数据库记录中只有一个对象。如果最终查找已经存储的对象,则将导致更多的对象和更多的数据库查找,但是Rails具有查询缓存,因此可以减少此类查找。

您可能有all_nodes而不是返回了lazy enumerator,然后,如果您没有检查整个尾巴,则每个访问的节点只有一个呼叫,并且可以处理无限(甚至循环)列表。

答案 1 :(得分:0)

ActiveRecord使用ActiveRecord::ConnectionAdapters::ConnectionPool连接到您的数据存储,该数据存储具有5个连接的默认池。因此,最多,每个Rails / ActiveRecord实例将使用最大数据库连接数作为配置的连接池大小。