【发布时间】:2021-05-04 00:46:27
【问题描述】:
RMySQL 库的 dbDisconnect 函数没有正确关闭数据库连接。这是我在本地测试过的代码
library(RMySQL)
execute.query <- function(query){
mydb_con <- dbConnect(MySQL(), user='username', password='pass', dbname='student', host='db_ip')
returned_data <- dbGetQuery(mydb_con, query)
dbDisconnect(mydb_con)
return(returned_data)
}
for(i in c(1:100)){
print(paste0("i = ", i));
execute.query(paste("select now()"));
}
顺序执行 100 个 SQL 查询,理想情况下应该为每个查询创建和关闭新的数据库连接,但在执行上述代码后,我可以看到使用此命令 watch netstat -nat | grep {db_ip} |wc -l 数据库连接数从 0 变为 20,直到第一次20 个查询,将其保持在 18-24 个连接,直到第 100 个查询,10 秒后程序完成执行,耗尽到 0 个连接。
所以我的问题是为什么 dbDisconnect 没有关闭数据库连接?这里有什么我想了解的细微差别吗?
由于这个问题,当连接数达到 1000+ 时,我的生产 R 代码(巨大的多线程遗留代码库)中出现 Failed to connect to database: Error: Can't create TCP/IP socket (24) 错误
【问题讨论】: