R语言中使用DBI断开DuckDB后重连提示文件被占用
DuckDB断开重连报错的解决方法
问题出在DuckDB的连接断开逻辑上——默认调用dbDisconnect()并不会彻底关闭数据库引擎进程,导致数据库文件被持续锁定,无法立即重连。而SQLite的连接断开会直接释放文件锁,所以不会出现这个问题。
修正方案
在调用dbDisconnect()时添加shutdown = TRUE参数,强制关闭DuckDB引擎并释放所有资源:
library("DBI") con2 <- dbConnect(duckdb::duckdb(), dbdir="my-db.duckdb", read_only = FALSE) dbListTables(con2) dbWriteTable(con2, "mtcars", mtcars) dbListTables(con2) # 断开时强制关闭引擎,释放文件锁 dbDisconnect(con2, shutdown = TRUE) # 现在可以正常重连 con2 <- dbConnect(duckdb::duckdb(), dbdir="my-db.duckdb", read_only = FALSE)
补充说明
- DuckDB默认保留后台引擎是为了复用连接提升性能,但这会导致文件持续被占用;
shutdown = TRUE会彻底终止引擎进程,释放文件锁。 - 如果存在多个指向同一数据库的连接,需要确保所有连接都执行带
shutdown = TRUE的断开操作,否则文件锁依然存在。
内容的提问来源于stack exchange,提问作者arnyeinstein
相关产品推荐
相关产品推荐

