2

我正在开发一个模块化的 Sinatra 应用程序。我用独角兽。该应用程序需要对 db 等进行一些初始设置,我在哪里做呢?

我的 config.ru:

require './main.rb'

disable :run #disable internal webserver

run App.new

我的档案:

web: unicorn -p 8080 -c ./unicorn.rb

我的独角兽.rb:

worker_processes 4
timeout 30

设置发生在 main.rb 中的某处。

4

2 回答 2

2

活动记录

如果您使用ActiveRecord作为您选择的 ORM,您可以在 Unicorn before_fork挂钩中添加类似的内容。这将关闭与数据库的任何现有连接。

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and
   ActiveRecord::Base.connection.disconnect!
end

并将其添加到after_fork钩子中。这将在每个独角兽分叉后建立新的连接。

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

数据映射器

如果您使用DataMapper,您可以在before_fork钩子中添加类似的内容。这次您将使用DataObjects来处理连接 - DataObjects是一个 gem,它使用更标准的接口重写现有的 Ruby 数据库驱动程序。DataMapper在内部使用DataObjects来管理与数据库的连接。处理连接后, DataMapper将在需要时重新连接。

before_fork do |server, worker|
  DataObjects::Pooling.pools.each do |pool|
    pool.dispose
  end
end
于 2014-06-11T07:07:12.640 回答
1

理想情况下,在您的应用程序之外,作为在 unicorn 启动之前运行的东西。

您可以潜在地将设置部分main.rb放在unicorn.rb.

于 2012-10-11T06:46:10.237 回答