Несколько экземпляров базы данных levelDB одновременно - PullRequest
11 голосов
/ 07 февраля 2012

Есть ли способ получить доступ к базе данных levelDB из нескольких программ?Есть ли какая-нибудь опция, позволяющая открыть базу данных только для чтения?

На данный момент, когда я открываю одну и ту же базу данных для программ, я получаю:

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

Приветствия!

Ответы [ 3 ]

13 голосов
/ 07 февраля 2012

К сожалению, LevelDB разработан таким образом и не позволяет открывать более одного экземпляра базы данных. Все параметры предназначены для одного процесса, но если у вас несколько потоков, вы можете получить моментальный снимок и выполнить итерацию по нему в режиме только для чтения (позволяя другим потокам одновременно выполнять чтение / запись в базовую базу данных).

Хотите ли вы добиться определенного поведения? Если это так, дайте нам знать, что это такое, и мы могли бы помочь.

5 голосов
/ 08 мая 2014

Я смог сделать это в Linux, заставив каждый процесс создать свой собственный каталог (например, $ HOME / .leveldb / myprogram_myPID) и затем выполнить:

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

Затем $ HOME / .leveldb/ myprogram_myPID может использоваться как база данных leveldb только для чтения, и несколько экземпляров процесса могут делать это одновременно, не копируя всю базу данных.

Вероятно, целесообразно использовать моментальный снимок для доступа к БД после этого, чтобы избежать случайной записи.Кроме того, не забудьте удалить новый каталог, когда процесс завершится.

4 голосов
/ 23 января 2014

Если вам нужен только доступ только для чтения , каждый процесс может создать копию папки LevelDB :

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

Затем вместо оригинального levelDBdatabase используйте levelDBdatabase-copy1.
Когда программа завершена, копию можно безопасно удалить.

...