2012-02-07 12 views
6

¿Hay alguna manera de acceder a una base de datos de nivelDB desde varios programas? ¿Hay algún tipo de opción para abrir la base de datos como de solo lectura?Varias instancias de una base de datos levelDB al mismo tiempo

Por ahora, al abrir la misma base de datos a partir de los programas me sale:

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

Salud!

Respuesta

10

Desafortunadamente, LevelDB está diseñado de esa manera y no permite que se abra más de una sola instancia de la base de datos. Todas las opciones son para un único proceso, pero si tiene múltiples hilos, entonces puede obtener una instantánea e iterar sobre ella en modo de solo lectura (permitiendo que otros hilos lean/escriban en la base de datos subyacente al mismo tiempo).

¿Deseas tener un comportamiento específico? Si es así, díganos qué es y podremos ayudarlo.

+0

Gracias por la respuesta. Podría tener varias instancias de un programa que busca en la misma base de datos. Una solución en la que estoy pensando es similar a la suya, envolviendo una clase alrededor de levelDB que luego controla el acceso a levelDB. – ezdazuzena

+1

Sí, a veces simplemente no hay una respuesta fácil. ¡Espero que esto haya sido útil! – Kiril

+1

bien, entonces ... obtienes la bandera y el +1. Cheers – ezdazuzena

3

Si sólo necesita acceso de sólo lectura, cada proceso puede crear una copia de la carpeta LevelDB:

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

Entonces, en lugar de utilizar el original levelDBdatabase, utilice levelDBdatabase-copy1.
Cuando el programa finaliza, la copia se puede eliminar de forma segura.

+0

O si está dispuesto a esperar, cada proceso puede esperar hasta que se bloquee ... haga un vuelco rápidamente ... y luego salga. –

+0

Buena idea, pero creo que esto llevaría un tiempo con mi base de datos de 30 Gb a nivel local. – forgetso

5

que era capaz de hacer esto en Linux haciendo que cada proceso de hacer un directorio de su propia (por ejemplo, $ HOME/.leveldb/myprogram_myPID) y luego hacer:

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

Entonces $ HOME/.leveldb/myprogram_myPID se puede utilizar como una base de datos leveldb de solo lectura y varias instancias del proceso pueden hacer esto al mismo tiempo sin copiar toda la base de datos.

Probablemente sea aconsejable utilizar una instantánea para acceder a la base de datos después de hacer esto para evitar escribir accidentalmente. Además, recuerde eliminar el nuevo directorio cuando finalice el proceso.

+1

esto ayuda ... pero realmente ... el acceso "de solo lectura/no confirmado" como este debe incorporarse a la biblioteca. –

Cuestiones relacionadas