2009-09-21 8 views
5

questo è un po 'correlato a this question.Blocca più jvm?

Sto usando make per estrarre alcune informazioni relative ad alcuni programmi in C. Sto completando la compilazione usando uno script bash che esegue il mio programma java e poi gcc. Fondamentalmente, sto facendo:

Vorrei utilizzare diversi lavori (opzione -j con make). Sta eseguendo diversi processi in base alle regole di dipendenza.

Se avessi capito bene, avrei avuto il maggior numero di istanze del lavoro come lavoro, giusto?

Il fatto è che sto usando sqlite-jdb per raccogliere alcune informazioni. Quindi il problema è come evitare diversi processi che provano a modificare il db allo stesso tempo? Sembra che il blocco sqlite sia dipendente da jvm (voglio dire che un blocco può essere "vedere" solo all'interno del jvm di blocco) e che questo è lo stesso per RandomAccessFile.lock().

Avete qualche idea su come farlo? (Creazione di un file tmp e poi guardando se esiste o no sembra essere una possibilità, ma può essere costoso. Una tabella di blocco nel DB?)

grazie

risposta

9

java.nio.channels.FileLock consente il blocco del file di processo a livello di sistema operativo.

Tuttavia, utilizzando make per avviare uno script di bash che esegue più JVM in parallelo prima di chiamare gcc suona anche Rube-Goldbergian e fragile per me.

+0

Ama il riferimento ... anche per me, è troppo fragile. Ma devo catturare tutti i parametri dati a gcc, e il sistema costruito è abbastanza complesso (e anche il sistema di costruzione), non avevo molta scelta. – LB40

4

Ci sono diverse soluzioni per questo. se il blocco deve essere all'interno della stessa macchina, è possibile utilizzare un socket del server per implementarlo (il processo che riesce a collegarsi alla porta è il proprietario del blocco, altri processi attendono che la porta diventi disponibile).

se è necessario un blocco che si estenda su più macchine, è possibile utilizzare un blocco memcached. questo richiederà un server memcached in esecuzione. Posso incollare del codice se sei interessato a questa soluzione.

è possibile ottenere la libreria Java per connettersi alla memcached here.

+0

solo un puntatore per il server memcached dovrebbe andare bene, grazie. – LB40

+0

ha aggiornato l'annswer per includere collegamenti java lib memcached e memcached. –

1

Si può provare Terracotta per condividere oggetti tra varie istanze JVM. Potrebbe sembrare una soluzione troppo pesante per le tue esigenze, ma almeno vale la pena considerarla.