あるデータベースから別のデータベースに大規模なデータセット (数百万のレコード) をインポートするために使用されるアプリケーションがあり、プロセスで差分を実行します (IE で削除されたものを削除したり、更新したりします)。多くの外部キー制約などにより、アプリケーションの処理を高速化しようとするため、宛先データベース全体をメモリにロードしてから、ソース データベースの一部をロードしようとし、メモリ内比較を実行して更新します。それが行くようにメモリ内の目的地。最後に、これらの変更を宛先に書き戻します。データベースは 1 対 1 で一致しないため、一方の単一のテーブルが他方の複数のテーブルになる場合があります。
だから私の質問に: 現在、このプロセスを実行するのに数時間かかります (追加/変更されたデータの量によっては、1 日近くかかることもあります)。これにより、デバッグが非常に困難になります。歴史的に、バグに遭遇した場合、変更を加えてからアプリを再実行し、すべてのデータを再度メモリにロードする必要があり (かなり時間がかかります)、元の部分に到達するまでインポート プロセスを実行します。そして、指を交差させて、変更が機能することを願っています。これは面白くない:(
デバッグ プロセスを高速化するために、インポート コードを別の appdomain に読み込まれる別の dll に移動してアーキテクチャを変更し、アンロード、変更、再読み込みして、インポートのセクションを実行できるようにします。もう一度、中断したところから再開し、より良い結果が得られるかどうかを確認します。この計画を思いついたとき、私は天才だと思いました:)しかし、問題があります。宛先データベースから 2 番目のアプリケーション ドメインにすべてのデータをロードしてから、アンロードする前に、[Serializable] 取引を使用してすべてのデータを最初のアプリケーション ドメインにコピーする必要があります (これは、dll をアンロードして再ロードするときに非常に遅くなります) またはロードします。ホスト appdomain のデータを取得し、MarshalByRefObject を使用して 2 番目にそれを参照します (プロセス全体が遅くなることが判明しました)。
だから私の質問は次のとおりです。どうすればこれをすばやく行うことができますか? のように、最大分!参照によって渡されたかのようにデータをコピーするだけで、実際に完全なコピーを行う必要はありません。
これを実装して、データを 2 つの間でより適切に共有したり、少なくともそれらの間で迅速にやり取りしたりできるようにするためのより良い方法があるかどうか疑問に思っていました。データベースの使用を推奨するもの (データベースを回避するためにデータをメモリにロードしている) や、MarshalByRefObject を使用するように言っているものを検索して見つけました。そんな簡単なことをしたいのですが、まだうまくいきません。
C++ dll またはアンマネージ dll をロードすると、アプリ ドメインが無視され、いくつかの問題が発生する可能性があることをどこかで読みました。とにかく私はこれを私の利点に使用することができます.アプリ ドメインをアンロードして、他の dll をアンロードしますか?
これが理にかなっていることを願っています。ここでの最初の質問なので、ひどい仕事をした場合は助けてください。これは数日間私をイライラさせました。