与えられた
専用のインメモリ 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
インメモリDBを使用しているため、うまくいきません。私はこのようなことを達成したいと思います:
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
ていないため、まだ機能していないようです.