我正在研究一系列用于处理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
因此,当线程消失时,连接也会消失(在释放资源时会发生清理)。
它一直在我的脑海中浮现,我想知道如果没有内置的连接池/管理会回来困扰我。
答案 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
然后您可以在以后使界面更加复杂,而无需触摸应用程序的其余部分。