создать соединение с базой данных postgresql, используя сиквел и пуму

Последние несколько недель я изучаю Ruby и должен сказать, что понять некоторые вещи было непросто.

Это заставляет меня задать этот вопрос, я пытаюсь настроить проект, который использует Rubinius в качестве движка ruby, puma в качестве веб-сервера (поскольку 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.

Кто-нибудь знает, как это сделать правильно, подключившись к базе данных?


person Roland    schedule 28.02.2014    source источник
comment
В любом случае было бы совершенно неправильно устанавливать соединение с базой данных PostgreSQL перед разветвлением. Вы не можете использовать один сокет и соединение для нескольких рабочих процессов. Вам нужно будет подключиться после разветвления воркеров.   -  person Craig Ringer    schedule 01.03.2014
comment
@craigringer ~ так ты говоришь, что это нормально, как я уже это делаю.   -  person Roland    schedule 01.03.2014
comment
Я недостаточно хорошо знаю инструменты, чтобы сказать наверняка. Все, что я хочу сказать, это то, что вы не можете безопасно использовать одно соединение PostgreSQL между несколькими разветвленными процессами, и вы должны установить соединение после разветвления рабочих процессов из основного процесса, а не до этого.   -  person Craig Ringer    schedule 02.03.2014


Ответы (1)


Если вы не настроили puma для форка и предварительной загрузки приложения (флаги -w и --preload), вам не нужно ничего делать. Если вы настроили puma для разветвления и предварительной загрузки, то после загрузки классов вашей модели вызовите DATABASE.disconnect. Вы также можете попросить разработчиков Puma добавить хук, похожий на before_fork в unicorn.

person Jeremy Evans    schedule 28.02.2014
comment
спасибо за предложение закрыть соединение после того, как я загружу все классы моделей, да, я предварительно загружаю приложение - person Roland; 01.03.2014
comment
У puma теперь есть хук before_fork github.com/puma/puma#clustered-mode - person Yo Ludke; 18.02.2020