如何通过RMySql检查与MySql的连接是否仍然存在?

时间:2017-01-25 10:15:27

标签: r rmysql r-dbi

我使用以下语句通过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的连接是否仍在工作时,检查的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

您仍然可能需要关闭与Passing arguments in constructor with boost factory而不是rm(con)的连接才能释放内部连接句柄并允许新连接。后者只删除&#34;指针&#34;连接对象(以便您不能再通过con访问此对象),但在dbDisconnect(con)之前它仍然存在。

您可以通过dbIsValid(con)检查连接是否有效,或使用简单的dbGetQuery(con, "SELECT 1")。我有兴趣知道前者是否检测到您的系统断开连接,围绕此主题有garbage collection