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