• ベストアンサー

ファイルをロックするには

現在Servletでファイルの書き込み、 または読み込みをするシステムを作ろうとしています。 同時に複数ユーザが同一ファイルにアクセスするのを 防ぐためにファイルをロックしたいと思っています。 Javaではファイルをロックするのに使うメソッドは ないと聞いたのですが、 実際にはどうしたら良いのでしょうか…。 できればサンプルのようなものがあると イメージが沸くので嬉しいのですが、 なければ「こうすれば実現できる」という方法だけでも ご存知でしたら教えていただけないでしょうか。 なお、syncronizedを使って ファイルアクセスするメソッドを排他にする方法は 使いたくありません。 ユーザAはファイル1、ファイル2、ファイル3を…。 ユーザBはファイル3、ファイル4、ファイル5を…、 といったように、一人のユーザも ほぼ同時に複数ファイルアクセスするので、 ロックしたいのは同じファイルだった場合のみ (しかもファイル名も動的に決まる) だからです。 もうしわけありません。 お力を貸していただけないでしょうか。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • alfeim
  • ベストアンサー率58% (114/195)
回答No.2

>3.無ければfileA.lockを作成し、 の部分はちゃんと排他制御してやる必要があります たしかJavaにはそのメソッドに同時に一つのプロセスしか実行を許さない修飾子がありましたよね?(synchronizedでしたっけ?、あまりJavaは詳しくないもので(^^;) 排他制御する時間自体は高々ファイルオープンと条件分岐数回程度なので一瞬ですのでパフォーマンスの問題にはならないと思います >servletの権限はservletEngineを起動したユーザの >権限なのかと思っていたのですが、違うのでしょうか。 ごめんなさい。私もservletがどのように動いているのかあまり詳しくないので、憶測入れながらになりますが・・・ 動きとしてはHTTP daemon -> servlet engineという呼び出しがされるみたいなので(自信ありません(^^;詳しい方に聞いて確かめてください)たぶん、www-dataやdaemonなどのuserになっていると思います。 サーバがUNIXであるのであればloginして ps aux | grep apache (apacheの部分はそちらのサーバで動いてるHTTP daemonに変えてください)とすれば左端にそのプログラムの動作しているユーザ権限が表示されているはずです ・・・あ、Windows98ですか・・・ Windows98であればサービスとしてプロセスを動かす方法はなかったはずですので通常、servletのユーザ権限はたちあげたユーザとなると思います(というか、Windows9xだとNetwork向こうからのユーザに対する設定は出来たけど、ローカルマシンユーザに対する設定はなかったかも・・・、という訳で気にする必要はないかもしれません) また、UNIX、Windows(他のどのOSにも限りませんが)servlet(Java)に現在ログインしているユーザを知る方法があるのであれば、それをHTMLなどと一緒に出してやれば現在のユーザは誰かは分かると思います

tontoto
質問者

お礼

>>3.無ければfileA.lockを作成し、 >の部分はちゃんと排他制御してやる必要があります やはりSynchro使わないとできないですか......。 でもファイルにアクセスしている部分をすべて排他にするよりはよさそうですね。 ありがとうございます。 権限のほうは、UNIXにサーブレットエンジンいれさせてもらって、 確かめてみました。 (それでこんなに時間かかりました。ごめんなさい) ps auxとしたらそのようなオプションないらしかったのですが、 ps -Afとか教えてもらってなんとかプロセスを表示してみたところ、 nobodyとかになっていました。(誰?) Unixは私にはやはり難しいです。 後半はよくわからなかったので、 「権限」というものについてもっと勉強してから出なおしてきます。 たびたび申し訳ありません。本当にありがとうございます。

その他の回答 (2)

  • yuji
  • ベストアンサー率37% (64/169)
回答No.3

私なら違うアプローチをします。 ロック・アンロックをプログラマが実装するのは面倒くさいので、私ならそういうものはデータベースに格納します。 データベースにロック・アンロックをまかせてしまえば 簡単です。 Javaとデータベースというのは相性がいい(使いやすい) ので、簡単に実現できます。

  • alfeim
  • ベストアンサー率58% (114/195)
回答No.1

よく使われる手法としては開くファイル名に決まったprefixとsuffixを付けたファイルをsize 0のlock fileとして生成する手段がよく使われます まず、ファイルを開く前にlockファイルを生成し、その後で本来開くファイルをopenします ファイルが既にある場合はopenメソッドが失敗するようにしておけばシステムのfile lockの代わりに使えると思います このlockファイルを作るメソッドをcritical sectionにしておけば、上手く行くと思います この方法の場合、servletで書き込み権限があるディレクトリが必要なので注意してください

tontoto
質問者

お礼

ありがとうございます。 1.fileAにアクセスしたいとき 2.まずfileA.lockファイルがないか確認し、 3.無ければfileA.lockを作成し、 4.fileA読みこみ/書きこみ作業を行い 5.file処理が終了したらfileA.lockを削除 とすれば…上手く行きそうですね! あ…3を同時に行おうとすればどうなるのでしょうか…。 あきらめるしかないのでしょうか…。 ところで、申し訳ありません、 >この方法の場合、servletで書き込み権限がある >ディレクトリが必要なので注意してください という注意が気になってしまいました。 servletの権限はservletEngineを起動したユーザの 権限なのかと思っていたのですが、違うのでしょうか。 rootとかAdministratorでservletEngineをインストール すると、どこにでもかけるのかと…。 (今の環境がwin98なので権限とかの概念がよくわからないのですが…) そうではなくて、Servletにアクセスした人の権限 (guest?とか…?)なのでしょうか。 それともservletは独自の権限を持っている…のでしょうか…。 とりあえず、Servletの下にフォルダ作成すれば大丈夫かな…とおもっているのですが…。 権限を調べる(Servletの…?)方法があるのでしょうか。 重ね重ね申し訳ありません。 もしご存知でしたら調べ方(?)の手がかりでも教えていただけないでしょうか。

関連するQ&A