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

时间:2010-12-28 23:12:46

标签: c sqlite

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

2 个答案:

答案 0 :(得分:5)

在类UNIX系统上,据我所知,它将继续使用原始文件,前提是您删除(而不是截断)它。在关闭所有文件句柄之前,此类系统不会真正删除文件(请参阅this question),我认为这是由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)次呼叫(即不重复使用文件句柄号)。

答案 1 :(得分:0)

我认为由于内存连接状态如缓存,可能会出现不可预测的错误。还要考虑读/写上的Sqlite块文件和原子上的AFAIK交换文件并不容易,因此在这一点上也可能存在错误。