アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在Servletでファイルの書き込み、
または読み込みをするシステムを作ろうとしています。
同時に複数ユーザが同一ファイルにアクセスするのを
防ぐためにファイルをロックしたいと思っています。
Javaではファイルをロックするのに使うメソッドは
ないと聞いたのですが、
実際にはどうしたら良いのでしょうか…。
できればサンプルのようなものがあると
イメージが沸くので嬉しいのですが、
なければ「こうすれば実現できる」という方法だけでも
ご存知でしたら教えていただけないでしょうか。

なお、syncronizedを使って
ファイルアクセスするメソッドを排他にする方法は
使いたくありません。
ユーザAはファイル1、ファイル2、ファイル3を…。
ユーザBはファイル3、ファイル4、ファイル5を…、
といったように、一人のユーザも
ほぼ同時に複数ファイルアクセスするので、
ロックしたいのは同じファイルだった場合のみ
(しかもファイル名も動的に決まる)
だからです。

もうしわけありません。
お力を貸していただけないでしょうか。
よろしくお願い致します。

A 回答 (3件)

>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などと一緒に出してやれば現在のユーザは誰かは分かると思います
    • good
    • 0
この回答へのお礼

>>3.無ければfileA.lockを作成し、
>の部分はちゃんと排他制御してやる必要があります

やはりSynchro使わないとできないですか......。
でもファイルにアクセスしている部分をすべて排他にするよりはよさそうですね。
ありがとうございます。

権限のほうは、UNIXにサーブレットエンジンいれさせてもらって、
確かめてみました。
(それでこんなに時間かかりました。ごめんなさい)

ps auxとしたらそのようなオプションないらしかったのですが、
ps -Afとか教えてもらってなんとかプロセスを表示してみたところ、
nobodyとかになっていました。(誰?)
Unixは私にはやはり難しいです。

後半はよくわからなかったので、
「権限」というものについてもっと勉強してから出なおしてきます。
たびたび申し訳ありません。本当にありがとうございます。

お礼日時:2001/03/02 21:24

私なら違うアプローチをします。



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

よく使われる手法としては開くファイル名に決まったprefixとsuffixを付けたファイルをsize 0のlock fileとして生成する手段がよく使われます



まず、ファイルを開く前にlockファイルを生成し、その後で本来開くファイルをopenします
ファイルが既にある場合はopenメソッドが失敗するようにしておけばシステムのfile lockの代わりに使えると思います
このlockファイルを作るメソッドをcritical sectionにしておけば、上手く行くと思います

この方法の場合、servletで書き込み権限があるディレクトリが必要なので注意してください
    • good
    • 0
この回答へのお礼

ありがとうございます。
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の…?)方法があるのでしょうか。
重ね重ね申し訳ありません。
もしご存知でしたら調べ方(?)の手がかりでも教えていただけないでしょうか。

お礼日時:2001/03/01 18:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!