我使用以下语句通过RMySQL包连接到mysql数据库:
con<-dbConnect(drv=RMySQL::MySQL(max.con=1,fetch.default.rec=500),host="host",dbname="dbname",password="psswd",user="user"))
到目前为止没有问题。当我检查:
>class(con)
[1] "MySQLConnection"
attr(,"package")
[1] "RMySQL"
一小时后,我使用了以下声明:
dbGetQuery(conn=con,"show tables")
我收到了一个错误:
Error in .local(dbObj, ...) :
internal error in RS_DBI_getConnection: corrupt connection handle
但是,如果我查看此声明:
dbListConnections(drv=RMySQL::MySQL())
它给出了:
[[1]]
<MySQLConnection:0,21>
当我尝试:
dbDisconnect(conn=con)
我得到同样的错误:
Error in .local(dbObj, ...) :
internal error in RS_DBI_getConnection: corrupt connection handle
然后我删除了连接对象:
rm(con)
当我尝试使用dbConnect()再次连接时,出现此错误:
con<-dbConnect(drv=RMySQL::MySQL(max.con=1,fetch.default.rec=500),host="host",dbname="dbname",password="psswd",user="user"))
Error in .local(drv, ...): Cannot allocate a new connection: 1 connections already opened
我知道dbListConnections()调用在没有与数据库的连接时返回一个空列表。但在这种情况下不返回空列表。
已损坏的连接句柄与已断开连接状态的连接状态不同?
OR
连接已超时?
检查与DB的连接是否仍在工作时,检查的最佳方法是什么?
答案 0 :(得分:3)
您仍然可能需要关闭与Passing arguments in constructor with boost factory而不是rm(con)
的连接才能释放内部连接句柄并允许新连接。后者只删除&#34;指针&#34;连接对象(以便您不能再通过con
访问此对象),但在dbDisconnect(con)
之前它仍然存在。
您可以通过dbIsValid(con)
检查连接是否有效,或使用简单的dbGetQuery(con, "SELECT 1")
。我有兴趣知道前者是否检测到您的系统断开连接,围绕此主题有garbage collection。