2009-09-21 6 views
5

これはthis questionに少し関係しています。いくつかのjvmをロックしますか?

私はmakeを使っていくつかのCプログラムに関する情報を抽出しています。私はJavaプログラムを実行してgccを実行するbashスクリプトを使ってコンパイルをラッピングしています。基本的に、私がやっている:

make CC=~/my_script.sh 

私はいくつかの仕事(メイクと-jオプション)を使用したいと思います。これは、依存関係のルールに従っていくつかのプロセスを実行しています。

私がうまく理解できれば、仕事と同じくらい多くのjvmインスタンスがあるでしょうか?

私はsqlite-jdbを使って情報を収集しています。だから問題は、同時にいくつかのプロセスを避けてdbを変更しようとすることです。 sqliteのロックはjvmに依存しているようです(ロックすることができるのは、ロックするjvmの中だけに "見る"ことができます)、これはRandomAccessFile.lock()と同じです。

どうすればいいですか? (tmpファイルを作成し、それは一つの可能​​性のようですが、高価でも存在するかどう見ている。dBで、ロックテーブルを?)

おかげ

答えて

9

java.nio.channels.FileLockは、OSレベルのクロスプロセスファイルロックを許可します。

しかし、gccを呼び出す前にいくつかのJVMを並行して実行するbashスクリプトを起動するにはmakeを使用すると、Rube-Goldbergianも鳴りすぎて壊れてしまいます。

+0

私はあまりにも壊れやすいリファレンスを愛しています。しかし、私はgccに与えられたすべてのパラメータをキャプチャしなければならず、構築されるシステムは非常に複雑です(そしてビルドシステムも)、私はあまり選択肢がありませんでした。 – LB40

4

これにはいくつかのソリューションがあります。 ロックが同じマシン内にある場合は、サーバーソケットを使用して実装することができます(ポートにバインドするプロセスは最初にロックを所有し、他のプロセスはポートが使用可能になるまで待機します)。

複数のマシンにまたがるロックが必要な場合は、memcachedロックを使用できます。これにはmemcachedサーバーが実行されている必要があります。このソリューションに興味があれば、コードを貼り付けることができます。

memcached hereに接続するJavaライブラリを取得できます。

+0

ちょうどmemcachedサーバーのポインタがうまくいくはずです、ありがとう。 – LB40

+0

は、memcachedとmemcachedのjava libリンクを含むようにannswerを更新しました。 –

1

さまざまなJVMインスタンス間でオブジェクトを共有する場合は、Terracottaを試してみてください。それはあなたのニーズには重すぎる解決策として見えるかもしれませんが、少なくとも検討する価値はあります。

関連する問題