给定
我有一个模型需要连接到专用的内存 SQLite 数据库。我正在做的是——在这样的类级别创建一个连接(这里我使用提供的连接跳过模式定义ExternalDatabase
):
class ExternalDatabase < ActiveRecord::Base
self.abstract_class = true
establish_connection(adapter: 'sqlite', database: ':memory:')
end
class MyModel < ExternalDatabase
end
问题
我怀疑上述定义在从多个线程访问时容易出错。一个很好的例子是在运行 Sidekiq 工作线程时,这些工作线程同时从它们的线程写入数据库。
所以问题是:
从不同线程访问数据库时,我对读/写冲突的怀疑是否正确?是否
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=
对 an 的直接方法ActiveRecord::Base
(尽管它没有记录#connection_id
,但似乎仍然不起作用。