Rails 4 上的主数据库和副本数据库

问题描述

我正在 Rails 4 上实现主/副本数据库,简单的 REST 实现,例如使用 POST 始终使用 primaryGET在这种情况下,副本 将不起作用,因为应用程序可能会修改任何给定请求的记录(将通知标记为已读、设置用户的上次登录时间等)。 >

我考虑过像这样覆盖 ActiveRecord persistance 方法

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true

  def save(*)
    write_only { super }
  end

  def save!(*)
    write_only { super }
  end

  def delete
    write_only { super }
  end

  def destroy
    write_only { super }
  end

  def becomes(klass)
    write_only { super(klass) }
  end

  def becomes!(klass)
    write_only { super(klass) }
  end

  def update_columns(attributes)
    write_only { super(attributes) }
  end

  private

  def write_only
    begin
      ActiveRecord::Base.establish_connection("#{Rails.env}_primary".to_sym)
      yield
    ensure
      ActiveRecord::Base.establish_connection("#{Rails.env}_replica".to_sym)
    end
  end
end

从此每个模型都从 ApplicationRecord 继承,例如:

class User < ApplicationRecord
  ...
end

此实现在大多数情况下都可以正常工作(特别是在 Rails 控制台上从未发现问题),但是我发现在某些情况下,我会收到错误,例如:Rails -- Exception: ActiveRecord::StatementInvalid: MysqL2::Error: MysqL client is not connected: ROLLBACK,特别是在使用 create 时,create!(顺便说一句,情况并非总是如此)

有更好的方法吗?

注意:我没有覆盖 create 方法,因为它们在内部调用 save,其他方法也是如此,但是我已经尝试过了,应用程序仍然失败。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)