打开与网络服务连接的宝石中的连接池

时间:2012-04-29 05:25:59

标签: ruby connection-pooling

我正在研究一系列用于处理Sphinx 2& Sms的宝石。实时索引,独立,使用Datamapper和ActiveRecord。它(显然)打开了与Sphinx的连接,以便做到这一点。

https://github.com/d11wtq/oedipus

Oedipus.connection("sphinxql.host.tld:9306")

现在我没有做任何关于管理连接的事情...如果gem的用户建立连接,则打开一个新连接就是这样。用户有责任管理该连接。然而,其他宝石似乎带来了池化的概念,我从来没有真正理解单线程环境。

有人可以告诉我为什么汇集可能是必要的,我的K.I.S.S的后果是什么。方法是,以及如何添加池?池化只在多线程应用程序中才有意义,每个线程实际存在一个连接,还是有其他有效用例?如果它只适用于多线程应用程序,那么用户可能比宝石制作假设更好地管理这个吗?

我猜测是一个线程实现,一个简单的“无限连接”方法是:

def connection
  Thread.current[:oedipus_connection] ||= connect(args)
end

因此,当线程消失时,连接也会消失(在释放资源时会发生清理)。

它一直在我的脑海中浮现,我想知道如果没有内置的连接池/管理会回来困扰我。

1 个答案:

答案 0 :(得分:1)

通常只有多线程应用程序需要多个连接。从理论上讲,单线程应用程序可以使用多个连接,但可能没有充分的理由。

连接池的主要好处是保持数据库连接以便重用,以最大限度地减少设置新数据库连接的开销。这在典型的每连接请求场景(例如rails)中很重要,其中每个请求可能只导致一个或几个数据库查询。然后,连接设置成为请求时间的重要部分。

但是建立一个合适的连接池系统有点像PITA。您需要担心连接超时和清理。请查看ActiveRecord connection pooling code以获取示例。

您可以通过创建使用正确的界面来推迟不必担心连接池。它会像

class MyConnection
    def self.get1(args)
        # establish a connection and return it
    end

    def close
        # close the connection
    end
end

或者

def use_connection
  connection = nil
  begin
    connection = open_a_connection
    yield connection
  ensure
    connection and connection.close
  end
end

然后您可以在以后使界面更加复杂,而无需触摸应用程序的其余部分。