部署 Rails 项目同时连接 MySQL 和 Oracle,部署到服务器上后报错 "The connection cannot be reused in the forked process"

kevin_he · 2016年11月28日 · 最后由 flowerwrong 回复于 2016年11月29日 · 1903 次阅读

项目同时连接了 mysql 和 oracle,本地开发时 mysql 和 oracle 均可正常访问、读取数据,部署到服务器之后,mysql 可以正常访问,但是如果打开一些需要从 oracle DB 读取数据的页面,就会报错:

坐等各位大神帮忙...

你是用 puma 还是 unicorn .这两个如果配置了多个 worker,需要对数据库连接和 redis 连接在 fork 后进行重连。

puma 示例

on_worker_boot do
  if defined?(ActiveRecord)
    ActiveRecord::Base.establish_connection
    LegacyUser.establish_connection(:legacy_db) # 使用的是另外一个数据库, legacy_db 为你在 database.yml 里面定义的数据库节点名
  end
end

#1 楼 @cxh116 使用的是 unicorn,应该怎么设置?服务器不太了解😓

怎么同时连两个数据库,请教下

#4 楼 @kevin_he 我没有试过,你可以测试下 重新连接

Test::ExternalData.connection.reconnect!

#4 楼 @kevin_he 1 楼说的很清楚了

  • 文件 config/unicorn.rb
after_fork do |server, worker|
    # Fork 后进行重连
    defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
    #TODO
end

#6 楼 @mystery 项目服务器上面 unicron.rb 已经做了如下设置,但是依旧报同样的错误😂

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

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

#7 楼 @kevin_he 你不是连接了两个数据库吗?ActiveRecord::Base.establish_connection只连了一个。按照你发的 csdn blog,那么大概应该是

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

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

我猜的,😄,没做过双数据库。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号