gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:58:33 25 4
gpt4 key购买 nike

问题可能是 并且在现实世界中没有实践过。无论如何,请给出您的想法/优点/缺点....
假设我有两个数据库 只读副本数据库主数据库
场景一:Model.all # 它应该从只读副本数据库中查询
场景二:Model.create(attributes) # 它应该在master数据库中创建数据
场景三:Model.where(condition: :some_condition).update(attributes) # 它应该从副本数据库读取数据并更新主数据库中的数据
注意:在运行时数据库应检测查询并处理上述 3 种情况。
问题:

  • 这是一个有效的期望吗?
  • 如果是,如何完全或部分实现这种情况?
  • 如果不是,在这种情况下有什么问题,我们将面临什么问题?
  • 最佳答案

    Rails 6 提供了一个框架,用于将传入请求自动路由到主数据库连接或只读副本。
    默认情况下,如果自上次写入请求(任何不是 GET 或 HEAD 请求的请求)以来至少 2 秒,此新功能允许您的应用程序自动将读取请求(GET、HEAD)路由到 read-relica 数据库被制作。
    指定何时将读取请求路由到副本的逻辑在解析器类中指定,ActiveRecord::Middleware::DatabaseSelector::Resolver默认情况下,如果您想要自定义行为,您可以覆盖它。
    中间件还提供了一个 session 类,ActiveRecord::Middleware::DatabaseSelector::Resolver::Session它的任务是跟踪上次发出写入请求的时间。像解析器一样,这个类也可以被覆盖。
    要启用默认行为,您需要将以下配置选项添加到应用程序的环境文件之一 - config/environments/production.rb例如:

    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
    如果您决定覆盖默认功能,您可以使用这些配置选项来指定您想要使用的延迟、您的自定义解析器类的名称以及您的自定义 session 类的名称,这两者都应该是默认类

    关于ruby-on-rails - 具有多个数据库的 Rails 6,基于读取或创建查询自动更改连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67422113/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com