- - PR -
ファイルの排他制御
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2009-01-30 13:35
ログを出力するアプリケーションを作成しようと考えています。
いかの処理を実行する、アプリケーションをシェルで同時に100回起動を受ける可能性があるとした場合、 どのような排他を考えたらよいでしょうか? 素人ではございますが、以下のような処理を考えて見ました。 しかし、使用してみたもののMutexの動作についても、詳しくわかりません。 解説もあわせていただけるとありがたいです、よろしくお願いいたします。 Private Sub WriteCsv(ByRef PathName As String, ByRef WriteDat As String) Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS") Dim mtx As System.Threading.Mutex = New Mutex mtx.WaitOne() Try Using writer As System.IO.StreamWriter = New System.IO.StreamWriter(PathName, True, enc) writer.WriteLine(WriteDat) writer.Close() End Using Catch ex As Exception End Try mtx.ReleaseMutex() mtx.Close() End Sub | ||||||||
|
投稿日時: 2009-01-31 10:25
本当にしたいこと、しなければならないことは何ですか?
今のコードでは、ミューテックスが有効なのは1つのプロセスのみです。複数のプロセスに対して有効にするためには、名前を与えてやらなければなりません。 しかし、同じアプリケーションが同時に起動した場合は排他制御できますが、それだけでいいですか?他の、メモ帳などが書き込んだりすることは、排除しなくてもよいですか? | ||||||||
|
投稿日時: 2009-02-02 09:18
Jitta様解答ありがとうございます。
クライアント、サーバー型のシステムにおいて、ログの出力を行うことを目的としています。 ログはDBの更新時のもので、ロールフォワードおよび、更新者の特定をするために使用します。 ログの保存量が多いため、操業データと同じDBに組み入れると、DBの負担が大きくなり、クライアントへのレスポンスの低下が生じると考えました。 そこで、ログの出力をCSVファイルへ行い、DBと別管理を行おうと考えました。 またログへの手動介入は運用上行わないということですので、 >他の、メモ帳などが書き込んだりすることは、排除しなくてもよいですか? は意識しておりませんでした。 サーバーにファイルに1行追加するだけのアプリを作成し、クライアント側から引数を渡し起動する、という仕様で考えていたため、複数クライアントからの同時実行を意識する必要が出てきたというわけです。 ASP.NETで使用できるような System.Web.HttpContext.Current.Application.Lock() を使用できれば良いと考え、 ミューテックスまたはセマフォに行き着いたのですが、仕組みがいまいち理解できずに投稿させていただきました。 | ||||||||
|
投稿日時: 2009-02-02 12:43
それ本当に排他ロックで実装して良いの?ログファイルのロック処理がボトルネックになる可能性があるけど。
ミューテックスは同一コンピュータ上で動作しているアプリケーション間でしか使えませんよ。今回の場合は各クライアントコンピューター上で動作するのですからミューテックスは使えません。ファイルを開く時にオプション指定でロックをかけることになるでしょう。 [ メッセージ編集済み 編集者: 甕星 編集日時 2009-02-02 12:43 ] | ||||||||
|
投稿日時: 2009-02-02 13:09
Shared Disk/Resource型クラスタなDBMSを実装したいんですか?
目的がそうでないならば大人しく適当なDBMS使った方がいいと思います。 | ||||||||
|
投稿日時: 2009-02-02 14:53
甕星さま解答ありがとうございます。
>それ本当に排他ロックで実装して良いの?ログファイルのロック処理がボトルネックになる可能性があるけど。 起動をかけるのはクライアント側からということになりますが、実際の動作はサーバー上で動作する単一処理です。 実処理との待ち合わせ等を行わないようにしたいと考えていました。 ログをファイルに書き出すだけの処理をサーバー上で動かすため、ミューテックスの使用を考えました。 あしゅさま解答ありがとうございます。 >Shared Disk/Resource型クラスタなDBMSを実装したいんですか? いいえ、ログを出力するために、そこまではできません。 >大人しく適当なDBMS使った方がいいと思います。 私もそう考えていますが、1度実装してみたいという思いもあり、またバッチ処理の速度面の向上にもつながるという理由で、ファイルシステムによるログ管理を考えています。 | ||||||||
|
投稿日時: 2009-02-02 19:19
サーバー/クライアントがどのような構成なのか不明ですし、 DBを更新するのがどちらなのかも文脈的に読み取れないので 的確なアドバイスは誰にもできないと思いますが、 サーバー上でのプロセス起動(「アプリの作成」から推測)にどんな方法を 取ったとしてもオーバーヘッドで逆に遅くなりそうな気がします。 というか、ロールフォワードに使うログってJournal Logですよね? コミットレコードのディスク同期などを考えるとネットワーク越しの ファイルシステム操作でまともな耐障害性を期待できるんでしょうか? | ||||||||
|
投稿日時: 2009-02-02 22:39
「メモ帳などのアプリケーションから書き込むのはよいのか?」について、「意識しておりませんでした。」というお答えですが、だからどうしたいのか?については、お答えいただいていませんよ?
2台のクライアントが同時に書き込みを行おうとしたら、サーバーは、どうするのですか?書き込まれるのは1つのファイルですよね?そのファイルへの書き込む動作は、どうしたいのですか?1台のクライアントからの書き込みのみ直列化して、複数台のクライアントからの書き込みは並列化するのですか? |
1|2|3
次のページへ»