问题描述
我正在 Rails 4 上实现主/副本数据库,简单的 REST
实现,例如使用 POST
始终使用 primary 和 GET
在这种情况下,副本 将不起作用,因为应用程序可能会修改任何给定请求的记录(将通知标记为已读、设置用户的上次登录时间等)。 >
我考虑过像这样覆盖 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 (将#修改为@)