- PR -

ファイルの排他制御

投稿者投稿内容
AKARI0418
会議室デビュー日: 2009/01/30
投稿数: 8
投稿日時: 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
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2009-01-31 10:25
本当にしたいこと、しなければならないことは何ですか?

今のコードでは、ミューテックスが有効なのは1つのプロセスのみです。複数のプロセスに対して有効にするためには、名前を与えてやらなければなりません。

しかし、同じアプリケーションが同時に起動した場合は排他制御できますが、それだけでいいですか?他の、メモ帳などが書き込んだりすることは、排除しなくてもよいですか?
AKARI0418
会議室デビュー日: 2009/01/30
投稿数: 8
投稿日時: 2009-02-02 09:18
Jitta様解答ありがとうございます。

クライアント、サーバー型のシステムにおいて、ログの出力を行うことを目的としています。
ログはDBの更新時のもので、ロールフォワードおよび、更新者の特定をするために使用します。

ログの保存量が多いため、操業データと同じDBに組み入れると、DBの負担が大きくなり、クライアントへのレスポンスの低下が生じると考えました。

そこで、ログの出力をCSVファイルへ行い、DBと別管理を行おうと考えました。

またログへの手動介入は運用上行わないということですので、
>他の、メモ帳などが書き込んだりすることは、排除しなくてもよいですか?
は意識しておりませんでした。

サーバーにファイルに1行追加するだけのアプリを作成し、クライアント側から引数を渡し起動する、という仕様で考えていたため、複数クライアントからの同時実行を意識する必要が出てきたというわけです。

ASP.NETで使用できるような
System.Web.HttpContext.Current.Application.Lock()
を使用できれば良いと考え、
ミューテックスまたはセマフォに行き着いたのですが、仕組みがいまいち理解できずに投稿させていただきました。

甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2009-02-02 12:43
引用:

AKARI0418さんの書き込み (2009-02-02 09:18) より:
サーバーにファイルに1行追加するだけのアプリを作成し、クライアント側から引数を渡し起動する、という仕様で考えていたため、複数クライアントからの同時実行を意識する必要が出てきたというわけです。


それ本当に排他ロックで実装して良いの?ログファイルのロック処理がボトルネックになる可能性があるけど。

引用:

ミューテックスまたはセマフォに行き着いたのですが、仕組みがいまいち理解できずに投稿させていただきました。


ミューテックスは同一コンピュータ上で動作しているアプリケーション間でしか使えませんよ。今回の場合は各クライアントコンピューター上で動作するのですからミューテックスは使えません。ファイルを開く時にオプション指定でロックをかけることになるでしょう。

[ メッセージ編集済み 編集者: 甕星 編集日時 2009-02-02 12:43 ]
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2009-02-02 13:09
Shared Disk/Resource型クラスタなDBMSを実装したいんですか?
目的がそうでないならば大人しく適当なDBMS使った方がいいと思います。
AKARI0418
会議室デビュー日: 2009/01/30
投稿数: 8
投稿日時: 2009-02-02 14:53
甕星さま解答ありがとうございます。

>それ本当に排他ロックで実装して良いの?ログファイルのロック処理がボトルネックになる可能性があるけど。

起動をかけるのはクライアント側からということになりますが、実際の動作はサーバー上で動作する単一処理です。
実処理との待ち合わせ等を行わないようにしたいと考えていました。

ログをファイルに書き出すだけの処理をサーバー上で動かすため、ミューテックスの使用を考えました。

あしゅさま解答ありがとうございます。
>Shared Disk/Resource型クラスタなDBMSを実装したいんですか?
いいえ、ログを出力するために、そこまではできません。
>大人しく適当なDBMS使った方がいいと思います。
私もそう考えていますが、1度実装してみたいという思いもあり、またバッチ処理の速度面の向上にもつながるという理由で、ファイルシステムによるログ管理を考えています。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2009-02-02 19:19
引用:

AKARI0418さんの書き込み (2009-02-02 14:53) より:
起動をかけるのはクライアント側からということになりますが、実際の動作はサーバー上で動作する単一処理です。
実処理との待ち合わせ等を行わないようにしたいと考えていました。

ログをファイルに書き出すだけの処理をサーバー上で動かすため、ミューテックスの使用を考えました。


サーバー/クライアントがどのような構成なのか不明ですし、
DBを更新するのがどちらなのかも文脈的に読み取れないので
的確なアドバイスは誰にもできないと思いますが、

サーバー上でのプロセス起動(「アプリの作成」から推測)にどんな方法を
取ったとしてもオーバーヘッドで逆に遅くなりそうな気がします。

というか、ロールフォワードに使うログってJournal Logですよね?
コミットレコードのディスク同期などを考えるとネットワーク越しの
ファイルシステム操作でまともな耐障害性を期待できるんでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2009-02-02 22:39
「メモ帳などのアプリケーションから書き込むのはよいのか?」について、「意識しておりませんでした。」というお答えですが、だからどうしたいのか?については、お答えいただいていませんよ?

引用:

起動をかけるのはクライアント側からということになりますが、実際の動作はサーバー上で動作する単一処理です。
実処理との待ち合わせ等を行わないようにしたいと考えていました。


2台のクライアントが同時に書き込みを行おうとしたら、サーバーは、どうするのですか?書き込まれるのは1つのファイルですよね?そのファイルへの書き込む動作は、どうしたいのですか?1台のクライアントからの書き込みのみ直列化して、複数台のクライアントからの書き込みは並列化するのですか?

スキルアップ/キャリアアップ(JOB@IT)