【发布时间】:2013-01-29 11:52:54
【问题描述】:
给定
我有一个模型需要连接到专用的内存 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 在
ActiveRecord::Base上缺少直接的#connection=方法(尽管它有未记录的#connection_id似乎仍然不起作用。
【问题讨论】:
标签: ruby-on-rails multithreading sqlite database-connection