2

共通のネットワーク ドライブに配置された CSV ファイルを解析する必要がある複数の IIS サーバーでアプリケーションを実行しています。System.IO.FileSystemWatcher Created イベントを使用して、ファイルが利用可能になったときにイベントの通知を受け取る場合、1 つのサーバーのみがファイルを解析するようにするにはどうすればよいですか? この変更がすべてのサーバーに通知されると、すべてのサーバーがそれを解析しようとします。最初のサーバーはこれをローカルにコピーして解析する必要がありますか? これにより、他のサーバーでエラーが発生しますか? 1 つのサーバーの読み取りアクセスのみを許可するようにリモート ディレクトリ アクセスを設定する必要がありますか?

ファイルには、共有データベースに挿入する必要があるレコードが含まれていますが、レコードの一意のキーがありません。したがって、複数のサーバーが同時にファイルを取得してレコードを挿入すると、データベースに重複が発生します。

4

2 に答える 2

2

重要な質問は次のとおりです。それらすべてがほぼ同時にファイルを解析しようとすると、何か問題が発生しますか? 複数の読み取りアクセスは基本的にファイル システム レベルで許可されているため、この事実だけで何かが壊れるとは限りません。

おそらく、最初のファイル アクセス時にロック ファイルを作成し、ファイルにアクセスする前にサーバーにロック ファイルを検索させる方法を試してみます。完了したら、ロック ファイルを削除します。

ファイルに排他ロックを設定することもできます。一度に 1 つのサーバーのみが実行できます。他の人は試行に失敗します:

FileStream fs = new FileStream(
  FilePath, 
  FileMode.Open,
  FileAccess.ReadWrite, 
  FileShare.None
);
于 2008-10-21T06:22:15.663 に答える
0

ロックの代わりの別のオプションは、ファイルの名前をディレクトリに変更することです。サーバーごとにサブディレクトリを作成し、サーバーにファイルの名前をそのディレクトリに変更してもらいます (名前の変更はアトミック操作です)。成功したものは、ファイルを解析します。

ロックの問題は、ファイルが各サーバーに引き続き表示され、ファイルを開こうとしてエラーが繰り返される可能性があるため、注意が必要です。名前の変更は、ファイルの所有者に関して絶対的です。

また、どのソリューションを使用しても、「失われたファイル」が発生する可能性があることに注意してください。サーバーがファイルの処理を停止すると (エラー、例外、再起動など)、破棄される可能性があります。これらのタイプの問題に対する典型的な解決策は、サーバーが時々ポーリングするファイルウォッチャーのようなものに加えることです.

ファイルをサーバーディレクトリにコピーすると、これに少し役立ちます。欠点の 1 つは、サーバーが完全にオフラインになると、サーバーがオンラインに戻るまでそのファイルがディレクトリに置かれることです。

于 2008-10-29T01:58:36.513 に答える