2

与えられた

専用のインメモリ SQLite データベースへの接続を必要とするモデルがあります。私がやっていることは、次のようなクラスレベルで接続を作成することです(ここでは、によって提供される接続を使用してスキーマ定義をスキップしていますExternalDatabase):

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

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

class MyModel < ExternalDatabase
end

問題

上記の定義は、複数のスレッドからアクセスする場合にエラーが発生しやすいのではないかと思います。その良い例は、スレッドから同時にデータベースに書き込む Sidekiq ワーカーを実行する場合です。

したがって、質問は次のとおりです。

  1. 異なるスレッドからデータベースにアクセスするときの読み取り/書き込みの競合について、私の疑いは正しいですか? sqlite下位レベルでリソースをロックすると、読み取り/書き込みへの安全な同時アクセスが可能になりますか?

  2. 実行時に特定のモデルのメモリ内 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ていないため、まだ機能していないようです.

4

2 に答える 2

1

以下の 2 つの結論が得られました。

  1. インメモリ DB の場合、スレッドは常に一意の接続を取得します。つまり、独自のバージョンの DB は常に「新鮮」であり、他のスレッドの同様の DB と干渉しません。
  2. 通常のDBの場合、クラス定義内ではなく実行時に接続が確立されていることを確認する必要があります。
于 2013-04-20T20:07:23.540 に答える
0

これは使えるかもしれません。

http://www.sqlite.org/faq.html#q6

これをざっと読んだところ、複数のスレッドが同じ sqlite データベースにアクセスすることで問題を解決できることがわかりましたが、これは避けるべきことであり、いくつかの落とし穴があります。

于 2013-01-29T14:30:49.810 に答える