首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails 6具有多个数据库,基于读取或创建查询自动更改连接

Rails 6具有多个数据库,基于读取或创建查询自动更改连接
EN

Stack Overflow用户
提问于 2021-05-06 16:16:00
回答 1查看 546关注 0票数 6

问题可能是愚蠢的,而它并没有在现实世界中得到实践。无论如何,请给出你的想法/利弊..。

假设我有两个数据库读取副本数据库主数据库

场景1:

Model.all #它应该从读副本数据库中查询

场景2:

Model.create(attributes) #它应该在主数据库中创建数据

场景3:

Model.where(condition: :some_condition).update(attributes) #它应该从副本数据库读取数据并更新主数据库中的数据

注意:在运行时,数据库应该检测查询并处理上述3种场景。

问题:

这是一个有效的expectation?

  • if --是的,如何完全实现这个情况,还是partially?

  • if,不,这个情况有什么问题,我们将面临什么问题?
EN

回答 1

Stack Overflow用户

发布于 2021-05-06 16:32:31

Rails 6为将传入请求自动路由到主数据库连接或读取副本提供了一个框架。

默认情况下,这个新功能允许您的应用程序自动将读取请求( GET,HEAD)路由到读-relica数据库,如果上次写请求(任何请求不是GET或HEAD请求)至少已经2秒了。

指定何时将读取请求路由到副本的逻辑是在解析器类(默认情况下为ActiveRecord::Middleware::DatabaseSelector::Resolver )中指定的,如果需要自定义行为,将重写该类。

中间件还提供了一个会话类ActiveRecord::Middleware::DatabaseSelector::Resolver::Session,它负责跟踪上一次写请求是何时发出的。和解析器一样,这个类也可以被重写。

要启用默认行为,您可以将以下配置选项添加到应用程序的一个环境文件--例如config/environments/production.rb

代码语言:javascript
运行
复制
config.active_record.database_selector = { delay: 2.seconds }
config.active_record.database_resolver = 
  ActiveRecord::Middleware::DatabaseSelector::Resolver
config.active_record.database_operations = 
  ActiveRecord::Middleware::DatabaseSelector::Resolver::Session

如果您决定覆盖默认功能,可以使用这些配置选项来指定要使用的延迟、自定义解析器类的名称和自定义会话类的名称,这两个类都应该是默认类的后代。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67422113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档