2

我已经使用以下语句通过 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() 调用会返回一个空列表。但在这种情况下不会返回一个空列表。

损坏的连接句柄是否与断开状态连接状态不同?

或者

连接已超时?

检查与数据库的连接是否仍在工作的最佳方法是什么?

4

1 回答 1

4

您仍然可能需要关闭连接,dbDisconnect(con)而不是rm(con)释放内部连接句柄并允许新连接。后者只删除了一个指向连接对象的“指针”(这样你就不能再通过 访问这个对象了),但在垃圾回收con之前它仍然物理存在。

您可以通过 来检查连接是否有效dbIsValid(con),或者使用简单的dbGetQuery(con, "SELECT 1"). 我很想知道前者是否检测到您的系统断开连接,GitHub 上有关于此主题的讨论。

于 2017-01-26T08:07:46.997 回答