2012-09-12 1 views
0

У меня есть база данных SQLite3 в общей папке. Я хочу перезаписать db-файл из приложения Java. Хотя в этом файле есть низкий трафик чтения и записи, я хочу убедиться, что: а) перезапись не повреждает файл db, и b) любой, кто может искать доступ к файлу db, по существу видит его заблокированным до тех пор, пока не будет перезаписана завершено. Мой текущий план выглядит примерно так ...Перезапись базы данных SQLite в общей сетевой папке

String query = "BEGIN EXCLUSIVE TRANSACTION"; 
/* Execute this query*/ 
File sourceFile = new File(LocalPath); 
File destFile = new File(DbPath); 

InputStream inStream = new FileInputStream(sourceFile); 
OutputStream outStream = new FileOutputStream(destFile); 

byte[] buffer = new byte[1024]; 

int length; 

while((length = inStream.read(buffer)) > 0) { 
    outStream.write(buffer, 0, length); 
} 

inStream.close(); 
outStream.close(); 

/* Now release lock */ 

query = "ROLLBACK TRANSACTION"; 

/* Execute query */ 

Поэтому чтение руководства с SQLite здесь http://www.sqlite.org/howtocorrupt.html, казалось бы, эта блокировка будет существовать в журнале и обновляться после копирования при запуске транзакции отката. В то же время, если клиент пытается получить доступ к Db во время копирования, я думаю, что они просто не найдут файл, а мой драйвер SQLite предположит, что db не существует. Правильно?

Мой вопрос ... это спорный момент, чтобы поместить замок на db? Есть ли лучшая стратегия или способ заставить db быть заблокированным, а не отсутствовать? Кроме того, я подвергаюсь огромному риску повреждения базы данных, что делает это невыполнимым? Еще одна мысль, которая у меня была, это заблокировать файл db, записать новый файл на другое имя, а затем переименовать после завершения записи, затем отпустить блокировку ... какие-нибудь мысли по этому поводу?

Не уверен, что переписывание DB-файла - это блестящая идея, но единственная возможная вещь, которую я могу придумать для ресурсов, которые у меня есть (огромные транзакции на db в общей папке по сети неприемлемо медленны Я знаю, что у меня выше риск коррупции, работающей с SQLite db в общей папке). Я пишу обновления локально, а затем позволяя пользователю выбрать «фиксацию» изменений и инициировать копию файла db.

В дополнение к ответу на мои вопросы, любые общие рекомендации по этому делу приветствуется ...

+1

Вы знаете https://www.sqlite.org/faq.html#q5? –

+0

https://www.sqlite.org/faq.html#q5 Не следует переписывать базу данных SQLite и стратегии доступа при перезаписи. – bristophocles

ответ

1

Backup API позволяет перезаписать базу данных.

(я не знаю, если ваш Java обертка предоставляет этот API.)

Смежные вопросы