【发布时间】:2017-06-10 11:20:04
【问题描述】:
我已经使用这个语句通过 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() 调用会返回一个空列表。但在这种情况下不会返回一个空列表。
损坏的连接句柄与断开连接状态的连接状态是否不同?
或
连接已超时?
检查与 DB 的连接是否仍然有效的最佳方法是什么?
【问题讨论】:
-
长时间保持连接打开是一个非常非常严重的错误。您应该在完成使用后立即关闭连接。原因是在连接打开时获取的任何事务、锁会一直持续到连接关闭,从而导致严重的性能下降。只需关闭连接并在需要时仅打开它
-
换句话说,如果你在别人使用的数据库上这样做,你会接到 DBA 的紧急电话
-
@PanagiotisKanavos 好的。感谢您指出错误。所以我应该假设这是我的一个实现错误,而不是包的问题?
-
是的。事实上,删除空闲连接是自 6.2 版以来的标准行为。 Check this link。通过连接池,驱动程序将清理并缓存您关闭的连接,以便您下次打开连接时可以使用它们。这意味着如果池中有可用的连接,则打开连接的成本是最低的