Можно ли заменить файл sqlite, когда программа имеет открытое соединение с БД? - PullRequest
2 голосов
/ 29 декабря 2010

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

Ответы [ 2 ]

5 голосов
/ 29 декабря 2010

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

. Вы можете выполнить тест с помощью командыСтрока клиента:

echo "create table foo(a); insert into foo values(1);" | sqlite3 test1.db
echo "create table foo(a); insert into foo values(2);" | sqlite3 test2.db
sqlite3 test1.db
SQLite version 3.6.16
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from foo;
1

Сейчас (в другой вкладке или окне):

rm test1.db; cp test2.db test1.db

Назад в sqlite:

sqlite> select * from foo;
1

strace на клиенте подтверждаетчто он закрывает файл базы данных непосредственно перед выходом:

open("/tmp/test1.db", O_RDWR|O_CREAT|O_LARGEFILE, 0644) = 3
...
close(3)                                = 0
exit_group(0)                           = ?

Кроме того, я проверил, и нет никаких входящих вызовов close(3) (т. е. номер дескриптора файла не используется повторно).

0 голосов
/ 29 декабря 2010

Я думаю, что из-за состояния соединения с памятью, такого как кеш, могут возникать непредсказуемые ошибки.Также учтите, что файл блока Sqlite при чтении / записи и элементарная замена файла AFAIK не легки, поэтому в этой точке тоже могут быть ошибки.

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