gpt4 book ai didi

c - 当程序具有打开的数据库连接时,可以替换 sqlite 文件吗?

转载 作者:行者123 更新时间:2023-12-02 08:15:30 25 4
gpt4 key购买 nike

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

最佳答案

在类 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) 调用(即文件句柄号未重用)。

关于c - 当程序具有打开的数据库连接时,可以替换 sqlite 文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4550272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com