У меня есть база данных 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.
В дополнение к ответу на мои вопросы, любые общие рекомендации по этому делу приветствуется ...
Вы знаете https://www.sqlite.org/faq.html#q5? –
https://www.sqlite.org/faq.html#q5 Не следует переписывать базу данных SQLite и стратегии доступа при перезаписи. – bristophocles