現在Servletでファイルの書き込み、
または読み込みをするシステムを作ろうとしています。
同時に複数ユーザが同一ファイルにアクセスするのを
防ぐためにファイルをロックしたいと思っています。
Javaではファイルをロックするのに使うメソッドは
ないと聞いたのですが、
実際にはどうしたら良いのでしょうか…。
できればサンプルのようなものがあると
イメージが沸くので嬉しいのですが、
なければ「こうすれば実現できる」という方法だけでも
ご存知でしたら教えていただけないでしょうか。
なお、syncronizedを使って
ファイルアクセスするメソッドを排他にする方法は
使いたくありません。
ユーザAはファイル1、ファイル2、ファイル3を…。
ユーザBはファイル3、ファイル4、ファイル5を…、
といったように、一人のユーザも
ほぼ同時に複数ファイルアクセスするので、
ロックしたいのは同じファイルだった場合のみ
(しかもファイル名も動的に決まる)
だからです。
もうしわけありません。
お力を貸していただけないでしょうか。
よろしくお願い致します。
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などと一緒に出してやれば現在のユーザは誰かは分かると思います
>>3.無ければfileA.lockを作成し、
>の部分はちゃんと排他制御してやる必要があります
やはりSynchro使わないとできないですか......。
でもファイルにアクセスしている部分をすべて排他にするよりはよさそうですね。
ありがとうございます。
権限のほうは、UNIXにサーブレットエンジンいれさせてもらって、
確かめてみました。
(それでこんなに時間かかりました。ごめんなさい)
ps auxとしたらそのようなオプションないらしかったのですが、
ps -Afとか教えてもらってなんとかプロセスを表示してみたところ、
nobodyとかになっていました。(誰?)
Unixは私にはやはり難しいです。
後半はよくわからなかったので、
「権限」というものについてもっと勉強してから出なおしてきます。
たびたび申し訳ありません。本当にありがとうございます。
No.3
- 回答日時:
私なら違うアプローチをします。
ロック・アンロックをプログラマが実装するのは面倒くさいので、私ならそういうものはデータベースに格納します。
データベースにロック・アンロックをまかせてしまえば
簡単です。
Javaとデータベースというのは相性がいい(使いやすい)
ので、簡単に実現できます。
No.1
- 回答日時:
よく使われる手法としては開くファイル名に決まったprefixとsuffixを付けたファイルをsize 0のlock fileとして生成する手段がよく使われます
まず、ファイルを開く前にlockファイルを生成し、その後で本来開くファイルをopenします
ファイルが既にある場合はopenメソッドが失敗するようにしておけばシステムのfile lockの代わりに使えると思います
このlockファイルを作るメソッドをcritical sectionにしておけば、上手く行くと思います
この方法の場合、servletで書き込み権限があるディレクトリが必要なので注意してください
ありがとうございます。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- その他(Microsoft Office) OneDrive Personalについて 1 2022/08/02 18:25
- Excel(エクセル) Excelを開くとエラーが出る 2 2022/10/03 16:13
- PostgreSQL ポストグレにあるExcelファイルを開くには 1 2022/12/13 18:07
- フリーソフト イーファンビューでwebpファイルが開けません 1 2022/07/12 07:07
- Visual Basic(VBA) Excelのマクロについて教えてください。 作業フォルダ内に2つのファイルがあります。 このファイル 2 2023/07/09 13:40
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- Excel(エクセル) Excel、同じフォルダ内のExcelファイルの特定シートのみを1つのファイルに集約したい 8 2022/09/07 15:12
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel-VBA 撮影日時の取得
-
subversionからファイル取得時...
-
バッチによるショートカットの...
-
iniファイルのセクションについて
-
ファイルのアクセス権の取得
-
1フォルダに保存できるファイル...
-
JSONファイルをダウンロードさ...
-
FTPサーバからファイルをダウン...
-
HTMLタグのあるCSVファイルを利...
-
VBAを使い、Web上からファイル...
-
HTMLプログラムにExcelをリンク...
-
IEで複数のファイル選択方法
-
fopenでNULLを返されるがGetLas...
-
エクセルVBA ファイルOPEN時の...
-
Excelマクロでファイルオープン...
-
Excelでdatファイルを作成??
-
【Excel VBA】PDFを作成して,...
-
フォルダ作成用バッチファイル...
-
batファイル処理でのテキストフ...
-
OCXのライセンス
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチによるショートカットの...
-
1フォルダに保存できるファイル...
-
Excel VBAどこが間違ってますか?
-
エクセルVBA
-
ファイルのアクセス権の取得
-
HTMLプログラムにExcelをリンク...
-
エクセルVBA ファイルOPEN時の...
-
VBAでファイルを指定して印刷さ...
-
Excel-VBA 撮影日時の取得
-
subversionからファイル取得時...
-
VBAを使い、Web上からファイル...
-
JSONファイルをダウンロードさ...
-
ボタンをファイルにリンクさせたい
-
Windowsのメモ帳でジョークウイ...
-
一括ダウンロードの方法
-
FileUploadで複数ファイルのア...
-
HTMLタグのあるCSVファイルを利...
-
WebLogic/javaで一部JSPだけが...
-
global.asaについて
-
FTPサーバからファイルをダウン...
おすすめ情報