【问题标题】:How to check if the connection to MySql through RMySql persists or not?如何检查通过 RMySql 与 MySql 的连接是否持续存在?
【发布时间】: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。通过连接池,驱动程序将清理并缓存您关闭的连接,以便您下次打开连接时可以使用它们。这意味着如果池中有可用的连接,则打开连接的成本是最低的

标签: r rmysql r-dbi


【解决方案1】:

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

您可以通过dbIsValid(con) 来检查连接是否有效,或者使用简单的dbGetQuery(con, "SELECT 1")。我很想知道前者是否检测到您的系统断开连接,有一个 discussion on GitHub 围绕这个主题。

【讨论】:

  • 我确实尝试了问题中提到的 dbDisconnect(con)。但它会引发损坏的连接句柄错误。我明天要检查 dbIsValid(con) 命令。
  • 我建立了一个连接,查询了数据库,然后使用 dbDisconnect(con) 断开了它。之后,如果我执行, dbIsValid(con) :我收到损坏的连接句柄错误。但是使用相同的(con)我可以再次重新连接到数据库。我没有根据@Panagiotis Kanavos 的建议更改我的代码,因此我没有检查这个连接是否保持活动更长时间
  • 你看过pool吗?这是Github repo,这是intro article。它为您完成了所有这些样板工作......它基本上让您不必担心@Panagiotis Kanavos 在他写“保持连接打开这么长时间是一个非常非常严重的错误”时暗示的内容。它将确保您没有这样做,同时为您提供完全相同的语义。
猜你喜欢
  • 1970-01-01
  • 2019-07-30
  • 2017-03-04
  • 2015-10-05
  • 2012-12-12
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多