2012-02-07 2 views
6

Esiste un modo per accedere a un database levelDB da diversi programmi? C'è qualche tipo di opzione per aprire il dababase in sola lettura?Più istanze di un database levelDB allo stesso tempo

Per il momento, quando si apre lo stesso database da programmi ottengo:

/path/to/dir/with/levelDBdatabase/LOCK: Resource temporarily unavailable 

Cheers!

risposta

10

Sfortunatamente, LevelDB è progettato in questo modo e non consente più di una singola istanza del database da aprire. Tutte le opzioni sono per un singolo processo, ma se si hanno più thread, è possibile ottenere un'istantanea e iterare su di esso in modalità di sola lettura (consentendo ad altri thread di leggere/scrivere contemporaneamente nel database sottostante).

Vuoi raggiungere un comportamento specifico? In tal caso, facci sapere di cosa si tratta e potremmo essere in grado di aiutarti.

+0

Grazie per la risposta. Potrei avere diverse istanze di un programma che cerca nello stesso database. Una soluzione che sto pensando è simile alla tua, avvolgendo una classe attorno a levelDB che controlla l'accesso a levelDB. – ezdazuzena

+1

Sì, a volte non c'è una risposta facile. Spero che questo sia stato utile! – Kiril

+1

beh allora .. ottieni la bandiera e il +1. Cheers – ezdazuzena

3

Se avete solo bisogno accesso in sola lettura, ogni processo può creare una copia della cartella LevelDB:

cp -r /path/to/dir/with/levelDBdatabase /path/to/dir/with/levelDBdatabase-copy1

Poi, invece di utilizzare l'originale levelDBdatabase, utilizzare levelDBdatabase-copy1.
Al termine del programma, la copia può essere cancellata in modo sicuro.

+0

Oppure, se sei disposto ad aspettare, ogni processo può solo aspettare fino a quando non ottiene un blocco ... fai subito un dump ... e poi esci. –

+0

Bella idea, ma credo che questo richiederebbe un po 'di tempo con il mio database 30Gb localmente. – forgetso

5

sono stato in grado di farlo in linux da avere ogni processo crea una directory del proprio (ad esempio $ HOME/.leveldb/myprogram_myPID) e poi fare:

ln -s -t $HOME/.leveldb/myprogram_myPID /path/to/dir/with/levelDBdatabase/* 
rm $HOME/.leveldb/myprogram_myPID/LOCK 
touch $HOME/.leveldb/myprogram_myPID/LOCK 

Poi $ HOME/.leveldb/myprogram_myPID può essere utilizzato come database leveldb di sola lettura e più istanze del processo possono farlo allo stesso tempo senza copiare l'intero database.

Probabilmente è consigliabile utilizzare un'istantanea per accedere al db dopo averlo fatto per evitare di scrivere accidentalmente. Inoltre, ricorda di cancellare la nuova directory al termine del processo.

+1

questo aiuta ... ma in realtà ... l'accesso "sola lettura/non commesso" come questo dovrebbe essere integrato nella libreria. –