2014-02-28 52 views
2

在过去的几周里,我一直在学习Ruby,我必须说,要掌握一些东西并不容易。使用续集和puma创建与postgresql数据库的连接

这使我问这个问题,我试图建立它采用Rubinius红宝石发动机项目,puma作为网络服务器(因为彪马指出,最好由具有Rubinius的工作,因为他们的并发执行),PostgreSQL的作为数据库和sequel作为数据库的工具包。

我在努力的是做数据库连接。正因为如此,我做它在config.ru

require 'rubygems' 
require 'bundler/setup' 
require 'uri' 
require 'yaml' 
require 'erb' 


Bundler.require :default, ENV['RACK_ENV'] 

DATABASE.disconnect if defined?(DATABASE) 

if ENV['DATABASE_URL'] 
    db_config = URI.parse ENV['DATABASE_URL'] 
else 
    #noinspection RubyResolve 
    db_config = YAML.load(ERB.new(File.read('config/database.yml')).result)[ENV['RACK_ENV']] 
end 

DATABASE = Sequel.connect db_config 

require File.expand_path('../application/api', __FILE__) 

run APP::API 

但我已经告诉它不这样做,如果我想的并发性和不共享连接的最佳场所。如果我使用的是Unicorn,我会在before_fork中这样做,但Puma没有这样的功能。

尽管它确实提供了on_worker_boot但它对Sequel没有用处,因为如果预加载应用程序,Sequel在创建我的模型之前需要数据库连接(class SomeClass < Sequel::Model)。

我现在有点困惑,而且我不确定从哪里开始。我试图在这个问题上找到一些指南或一些好的做法,但我发现的唯一的东西是使用ActiveRecord。

有人知道如何正确地做到这一点,连接到数据库?

+1

无论如何在分叉之前建立PostgreSQL数据库连接是完全错误的。您不能在多个工作人员之间共享一个套接字和连接。您需要连接_after_ forking工作人员。 –

+0

@craigringer〜所以你说的是,我已经做得很好。 – Roland

+0

我不知道所涉及的工具是否足够肯定地说。我只是说你不能在多个分叉进程之间安全地共享一个PostgreSQL连接,并且你应该在从主进程中分派工作人员之后建立连接,而不是之前。 –

回答

1

如果你还没有设置美洲狮叉和预载应用程序(-w--preload标志),你不需要做任何事情。如果您已经设置好美洲狮叉子并预先加载,那么在加载模型类后,请致电DATABASE.disconnect。您可能还想要游说美洲狮开发者在麒麟中添加类似before_fork的钩子。

+0

感谢您在加载所有模型类后建议关闭连接,是的,我预先加载了应用程序 – Roland