2017-01-25 155 views
1

我已经通过使用这一说法RMySQL包连接到MySQL数据库:如何检查通过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()调用在没有连接到数据库时返回一个空列表。但在这种情况下不会返回空列表。

是在损坏的连接处理不同状态比断开状态连接的

连接超时?

如果与数据库的连接仍在工作,最好的方法是保持检查状态?

+2

保持连接打开这么久是非常非常严重的错误。您应该在完成使用后立即关闭连接。原因是任何事务,连接打开时获取的锁都会一直持续到关闭为止,导致严重的性能下降。只需关闭连接并在必要时打开它*仅在需要时 –

+1

换句话说,如果您在其他人使用的数据库上这样做,您会收到来自DBA的紧急电话 –

+0

@PanagiotisKanavos好吧。谢谢你指出这个错误。所以我应该认为这是我的一个执行错误,而不是包裹问题? – TUSHAr

回答

1

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

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

+0

我试过在问题中提到dbDisconnect(con)。但它会抛出损坏的连接句柄错误。我将在明天检查dbIsValid(con)命令。 – TUSHAr

+0

我建立了连接,查询了数据库,然后使用dbDisconnect(con)断开了连接。之后,如果我执行,dbIsValid(con):我得到了错误的连接句柄错误。但使用相同的(con)我可以重新连接到数据库。我没有检查过这个连接是否可以保持更长的时间,因为我根据@Panagiotis Kanavos的建议更改了我的代码。 – TUSHAr

+1

你看过“pool”吗?这里是[Github回购](https://github.com/rstudio/pool),这里有一个[介绍文章](http://shiny.rstudio.com/articles/pool-basics.html)。它为您完成了所有这些样板工作......它基本上可以让您不用担心@Panagiotis Kanavos在写道:“保持连接打开这么久是一个非常非常严重的错误。”它会确保你没有这样做,同时给你完全相同的语义。 –