2

在过去的几周里,我一直在学习 Ruby,我必须说要掌握一些东西并不容易。

这导致我问这个问题,我正在尝试设置一个项目,它使用Rubinius作为 ruby​​ 引擎,puma作为网络服务器(因为 Puma 声明它最好与 Rubinius 一起工作,因为它们的并发实现),PostgreSQL 作为数据库和续集作为数据库的工具包。

我正在努力的是建立数据库连接。事实上,我正在这样做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。

有人知道如何正确地执行此操作,连接到数据库吗?

4

1 回答 1

1

如果您还没有设置 puma 来分叉和预加载应用程序(-w--preload标志),那么您不需要做任何事情。如果您已将 puma 设置为分叉和预加载,则在加载模型类后,调用DATABASE.disconnect. 您可能还想游说 puma 开发人员添加类似于before_fork独角兽的钩子。

于 2014-02-28T16:40:12.810 回答