【问题标题】:create a connection with a postgresql database using sequel and puma使用 sequel 和 puma 创建与 postgresql 数据库的连接
【发布时间】: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


【解决方案1】:

如果您尚未设置 puma 来分叉和预加载应用程序(-w--preload 标志),则您无需执行任何操作。如果你已经设置 puma 来分叉和预加载,那么在加载你的模型类之后,调用DATABASE.disconnect。您可能还想游说 puma 开发人员在 unicorn 中添加类似于 before_fork 的钩子。

【讨论】:

  • 感谢您在我加载所有模型类后建议关闭连接,是的,我确实预加载了应用程序
  • puma 现在有一个before_fork 钩子github.com/puma/puma#clustered-mode
猜你喜欢
  • 1970-01-01
  • 2014-05-23
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
  • 2012-08-21
相关资源
最近更新 更多