2014-02-28 65 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