Чтение из заблокированной базы данных SQLite3 - PullRequest
4 голосов
/ 20 февраля 2010

Я смотрю на базу данных SQLite, принадлежащую стороннему процессу. Он выглядит заблокированным и содержит * -journal файл. Чего я не знаю, так это того, является ли блокировка общей или исключительной.

Я надеюсь прочитать из базы данных, хотя она в данный момент заблокирована этим другим процессом. Я буду только когда-либо читать из базы данных.

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

Я посмотрел на sqlite3_busy_handler, но это не похоже на решение. Из того, что я понимаю, это позволяет реализовать только механизм повторных попыток. Кажется, он не предлагает способ просто игнорировать тот факт, что база данных заблокирована.

Как я могу заставить SQLite читать из этой базы данных?

Кстати, я сейчас использую обертку FMDatabase API. Это не использует sqlite3_busy_handler. Он зацикливается до тех пор, пока получает код возврата SQLITE_BUSY.

1 Ответ

1 голос
/ 07 марта 2013

Я провел некоторое исследование по этому вопросу, и похоже, что есть некоторые (очень нежелательные) варианты.

  • Убить процесс, у которого заблокирована база данных

Это, вероятно, не вариант для вас, и это не для меня тоже.

  • Скопируйте файл и прочитайте копию

Это, кажется, лучшее решение этой проблемы. В моем случае я пытаюсь прочитать базу данных Firefox sqlite. Firefox блокирует файл на длительное время, поэтому я не могу просто ждать.

Поскольку вы копируете живой файл базы данных, вы можете получить поврежденную копию. Я не думаю, что есть риск испортить оригинал (но я не уверен в этом).

Просто скопируйте файл на оболочку, как

copy original.sqlite copy.sqlite

или

cp  original.sqlite copy.sqlite

Затем откройте как обычно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...