我有一个自身具有递归链接的模型,例如链表。如果我正在编写如下所示的函数(请原谅我的语法,那么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
答案 0 :(得分:0)
作为递归函数编写,每个节点将有一个调用SQL调用。下一步被调用,获取相关节点,并缓存该值。 (您可以根据需要重新加载它)。据我所知,该实现最终在每个数据库记录中只有一个对象。如果最终查找已经存储的对象,则将导致更多的对象和更多的数据库查找,但是Rails具有查询缓存,因此可以减少此类查找。
您可能有all_nodes
而不是返回了lazy enumerator,然后,如果您没有检查整个尾巴,则每个访问的节点只有一个呼叫,并且可以处理无限(甚至循环)列表。
答案 1 :(得分:0)
ActiveRecord
使用ActiveRecord::ConnectionAdapters::ConnectionPool
连接到您的数据存储,该数据存储具有5个连接的默认池。因此,最多,每个Rails / ActiveRecord实例将使用最大数据库连接数作为配置的连接池大小。