在程序与它打开数据库连接时,是否可以替换sqlite文件?

And*_*rey 2 c sqlite

我有一个C程序通过sqlite3_open_v2()打开一个sqlite3数据库,然后定期运行一些SELECT查询.如果我在程序运行时替换该文件,会发生什么不好的事吗?有没有正确的方法来避免问题?我想避免重启它.

Mat*_*hen 5

在类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
Run Code Online (Sandbox Code Playgroud)

现在(在另一个标签或窗口中):

rm test1.db; cp test2.db test1.db
Run Code Online (Sandbox Code Playgroud)

回到sqlite:

sqlite> select * from foo;
1
Run Code Online (Sandbox Code Playgroud)

strace 在客户端确认它在退出之前关闭数据库文件:

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

此外,我检查了并且没有中间close(3)调用(即文件句柄号不被重用).