【发布时间】:2014-03-01 00:40:12
【问题描述】:
过去几周我一直在学习 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做,但是彪马没有这样的功能。
虽然它确实提供了on_worker_boot,但它对 Sequel 没有用处,因为如果我预加载应用程序,Sequel 需要数据库连接才能创建我的模型 (class SomeClass < Sequel::Model)。
我现在有点困惑,我不知道从哪里开始。我试图在这个问题上找到一些指南或一些好的做法,但我发现的唯一东西是使用 ActiveRecord。
有人知道如何正确执行此操作,连接到数据库吗?
【问题讨论】:
-
无论如何在fork之前建立PostgreSQL数据库连接是完全错误的。您不能在多个工作人员之间共享一个套接字和连接。您需要在分叉工人之后连接。
-
@craigringer ~ 所以你的意思是我已经这样做了。
-
我不太了解所涉及的工具,无法确定。我要说的是,您不能安全地在多个分叉进程之间共享一个 PostgreSQL 连接,您应该在从主进程分叉工作人员之后而不是之前建立连接。
标签: ruby postgresql sequel puma rubinius