2

同じインメモリ データベース インスタンスを複数の AppDomains で使用できる、インメモリ データベースの実装があるのではないかと思います。

動機。多くの人と同じように、クライアント サーバー アプリケーションの統合テストがあります。クライアント、サーバー、およびデータベースがすべて異なるマシンに配置されている実際のシナリオから、クライアントとサーバーの両方が同じプロセス内の単純な 2 つの AppDomain である最も軽量なものまで、いくつかのテスト モードがあります。データベースは同じマシン上の sqlite ファイルです。

当然のことながら、軽量のシナリオが最も高速であり、開発者は日常的にそれを使用しますが、重いシナリオはビルドごとに CI サーバーで実行されます。

私の目標は、インメモリ データベースを使用して軽量シナリオをさらに高速化することです。

問題。OK、sqlite にはメモリ内データベース オプションがありますが、そのようなデータベースは次のようになります。

  • への接続が閉じられた後に破棄されます。
  • 2 つの接続を開くことはできません。新しい接続は別のデータベース インスタンスを開きます。

残念ながら、2 つ必要です。1 つはクライアント側の AppDomain で実行されるテスト ステージング コード用で、もう 1 つはサーバー側の DAL 用です。

sqlite インメモリ データベースの仕組みの背後にある理論的根拠を理解しています。また、2 つの AppDomain 間でメモリ内データベースを共有することの難しさも認識しています。メモリ マップされたファイルに戻らずに、2 つの AppDomains 間でメモリ バッファを共有するにはどうすればよいですか (また、ファイル システム API を扱いたくありません)。

私が見る唯一の効率的な解決策は、2 つの AppDomain でアンマネージ メモリ バッファーを共有することです。このバッファーへのハンドルは、ある AppDomain から別の AppDomain に渡されます。しかし、このセットアップをサポートするメモリ内データベースの実装はありますか?

(非効率的な解決策は、ある AppDomain から別の AppDomain にデータベース全体を渡し、再度戻すことです)。

私の分析は完全に間違っている可能性があり、見逃している簡単な解決策があるかもしれません。とにかく、誰かが同じ問題に遭遇したかどうか、そしてどのように解決したかを知りたい.

PS

メモリにマップされたファイルなど、あらゆる種類のファイル API は避けたいと思います。

4

2 に答える 2

0

私はそのようなデータベースを知りません。

しかし、そのようなデータベースがどのような形になるかを考えるのは楽しいことです。アプリ ドメインを軽量プロセスと見なすと、クロスドメイン通信 (シリアル化) をメッセージ パッシングとして扱うことができます。次に、クライアントがクエリを送信し、それに応じて結果を取得できるようにする単純なメッセージ プロトコルを定義できます。

  1. データベースは独自のアプリ ドメインで実行する必要があります
  2. 各クライアントは独自のアプリ ドメインで実行する必要があります
  3. クエリ結果を返すには、アプリ ドメイン間の標準シリアル化を使用する必要があります。これを行う最も簡単な方法は、構築時に実行される独自のクラスにクエリをカプセル化することです。そうすれば、AppDomain.CreateInstanceを使用できます。
  4. データベースは、任意のスレッドからの要求を処理できる必要があります。

私はこれが素晴らしいアイデアだとは思いません。これを 100% 正しく行うには、アプリ ドメインの動作と相互運用の詳細が多すぎます。

于 2009-09-03T07:15:08.277 に答える