2009-09-21 14 views
5

jest to trochę związane z this question.Zablokować kilka jvm?

Używam make, aby wyodrębnić niektóre informacje dotyczące niektórych programów C. Pakuję kompilację za pomocą skryptu bash, który uruchamia mój program java, a następnie gcc. Zasadniczo robię:

make CC=~/my_script.sh 

Chciałbym użyć kilku zleceń (opcja -j z marką). Działa kilka procesów zgodnie z regułami zależności.

Jeśli dobrze rozumiem, będę miał tyle instancji w jvm, co praca, prawda?

Chodzi o to, że używam sqlite-jdb do zbierania informacji. Problem polega więc na tym, jak uniknąć kilku procesów próbujących modyfikować db w tym samym czasie? Wygląda na to, że blokada sqlite jest zależna od jvm (tzn. Jedna blokada może być "widziana" tylko wewnątrz jvm blokowania) i że jest taka sama dla RandomAccessFile.lock().

Czy masz pojęcie, jak to zrobić? (Tworzenie pliku tmp, a następnie patrząc jeśli istnieje, czy nie wydaje się być jedną z możliwości, ale mogą być kosztowne. Stół blokujący w dB?)

dzięki

Odpowiedz

9

java.nio.channels.FileLock umożliwia blokowanie plików procesu na poziomie systemu operacyjnego.

Jednak, używając make, aby uruchomić skrypty basha, które uruchamiają kilka maszyn JVM równolegle przed wywołaniem gcc brzmi zbyt Rube-Goldbergian i łamliwe dla mnie.

+0

Uwielbiam odniesienia ... dla mnie też, to zbyt kruche. Ale muszę przechwycić wszystkie parametry podane do gcc, a zbudowany system jest dość złożony (i system budowy), nie miałem wielkiego wyboru. – LB40

4

istnieje kilka rozwiązań tego problemu. jeśli blokada powinna znajdować się na tym samym komputerze, możesz użyć gniazda serwera do jej implementacji (proces, który udaje się połączyć z portem, najpierw jest właścicielem blokady, inne procesy oczekują na udostępnienie portu).

Jeśli potrzebujesz blokady, która obejmuje wiele maszyn, możesz użyć blokady memcached. będzie to wymagało uruchomienia serwera memcached. Mogę wkleić kod, jeśli jesteś zainteresowany tym rozwiązaniem.

możesz pobrać bibliotekę Java, aby połączyć się z memcached here.

+0

po prostu wskaźnik dla memcached serwera powinien być w porządku, dziękuję. – LB40

+0

zaktualizował annswer, aby dołączyć memcached i memcached linki java lib. –

1

Możesz spróbować Terracotta udostępniać obiekty między różnymi instancjami maszyny JVM. To może wydawać się zbyt ciężkim rozwiązaniem dla twoich potrzeb, ale przynajmniej warte rozważenia.