gpt4 book ai didi

ruby-on-rails - 在运行时更改数据库连接

转载 作者:行者123 更新时间:2023-12-03 17:59:03 25 4
gpt4 key购买 nike

给定

我有一个模型,该模型需要连接到专用的内存SQLite数据库。我正在做的是-在这样的类级别创建一个连接(这里我使用ExternalDatabase提供的连接跳过模式定义):

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

establish_connection(adapter: 'sqlite', database: ':memory:')
end

class MyModel < ExternalDatabase
end

问题

我怀疑从多个线程访问时,上面的定义容易出错。一个很好的例子是,当运行Sidekiq worker 从其线程同时写入数据库时​​。

所以问题是:
  • 从不同线程访问数据库时,我的怀疑是否正确,关于读写冲突? sqlite是否将资源锁定在较低级别上,从而启用了安全的并发访问权限?
  • 如何在运行时更改给定模型的内存SQLite数据库连接? ActiveRecord::Base#establish_connection对我不起作用,因为我使用的是内存数据库。

    我想实现这样的目标:
    klass = Class.new(ActiveRecord::Base)
    klass.establish_connection(adapter: 'sqlite', database: ':memory:')

    create_schema(klass.connection)

    MyClass.connection = klass.connection

    但是Rails在#connection=上缺少直接的ActiveRecord::Base方法(尽管它有未公开的#connection_id,但似乎仍然不起作用。
  • 最佳答案

    有两个结论:

    对于内存数据库

  • ,一个线程总是获得唯一连接,即它自己的DB版本将始终是“新鲜”的,并且不会与其他线程中的类似DB相互干扰。
  • 对于常规数据库,
  • 应该确保在类定义之外的运行时建立连接。
  • 关于ruby-on-rails - 在运行时更改数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14582278/

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