使用RMySQL关闭活动连接

时间:2013-07-07 07:00:15

标签: mysql r

根据my question earlier today,我怀疑我有一个未封闭连接的问题,阻止数据被注入我的MySQL数据库。数据被允许进入当前未使用的表(因此我怀疑许多打开的连接阻止上传到该特定表)。

我在Ubuntu服务器上使用RMySQL将数据上传到MySQL数据库。

我正在寻找一种方法来a)确定连接是否打开b)如果它们是关闭它们。 sql命令行中的命令exec sp_whoexec sp_who2返回sql代码错误。

另一个注意事项:我能够连接,完成上传过程,并成功结束R进程,当我只尝试该表时,服务器上没有数据(通过sql命令行检查)。

(顺便说一句:如果所有其他方法都失败了,只需删除该表并创建一个同名的新表来修复它吗?这将是一个非常痛苦,但可行的。)

感谢您的帮助!

6 个答案:

答案 0 :(得分:17)

一个。 dbListConnections( dbDriver( drv = "MySQL"))

dbDisconnect( dbListConnections( dbDriver( drv = "MySQL"))[[index of MySQLConnection you want to close]])。关闭所有:lapply( dbListConnections( dbDriver( drv = "MySQL")), dbDisconnect)

是的,您可以重写表格,当然您会丢失所有数据。或者您可以指定dbWriteTable(, ..., overwrite = TRUE)。

我还会使用其他选项,例如row.namesheaderfield.typesquotesepeol。我在RMySQL中也有很多奇怪的行为。我记不清具体细节了,但是当我做错了什么时似乎没有错误消息,比如忘记设置row.names。 HTH

答案 1 :(得分:11)

关闭所有活动连接:

dbDisconnectAll <- function(){
  ile <- length(dbListConnections(MySQL())  )
  lapply( dbListConnections(MySQL()), function(x) dbDisconnect(x) )
  cat(sprintf("%s connection(s) closed.\n", ile))
}

执行: dbDisconnectAll()

答案 2 :(得分:2)

关闭连接

您可以将dbDisconnect()与dbListConnections()一起使用来断开RMySQL正在管理的连接:

    all_cons <- dbListConnections(MySQL())
    for(con in all_cons) 
      dbDisconnect(con)

检查所有连接是否已关闭

    dbListConnections(MySQL())

你也可以杀死你被允许的任何连接(不仅仅是那些由RMySQL管理的连接):

    dbGetQuery(mydb, "show processlist")

mydb是..

    mydb = dbConnect(MySQL(), user='user_id', password='password', 
                      dbname='db_name', host='host')

关闭特定连接

    dbGetQuery(mydb, "kill 2")
    dbGetQuery(mydb, "kill 5")

答案 3 :(得分:2)

最简单的:

lapply(dbListConnections( dbDriver( drv = "MySQL")), dbDisconnect)

列出所有连接并通过lapply断开连接

答案 4 :(得分:0)

lapply(dbListConnections(MySQL()), dbDisconnect)

答案 5 :(得分:0)

在当前版本中,“ dbListConnections”功能已被弃用,并且DBI不再需要驱动程序来维护连接列表。因此,以上解决方案可能不再起作用。例如。在RMariaDB中,上述解决方案会产生错误。

我使用以下替代方法进行了开发,该替代方法使用MySQL服务器的功能,并且应与当前的DBI /驱动程序版本兼容:

### listing all open connection to a server with open connection
query <- dbSendQuery(mydb, "SHOW processlist;")
processlist <- dbFetch(query)
dbClearResult(query)

### getting the id of your current connection so that you don't close that one
query <- dbSendQuery(mydb, "SELECT CONNECTION_ID();")
current_id <- dbFetch(query)
dbClearResult(query)

### making a list with all other open processes by a particular set of users
# E.g. when you are working on Amazon Web Services you might not want to close 
# the "rdsadmin" connection to the AWS console. Here e.g. I choose only "admin" 
# connections that I opened myself. If you really want to kill all connections,
# just delete the "processlist$User == "admin" &" bit.
queries <- paste0("KILL ",processlist[processlist$User == "admin" & processlist$Id != current_id[1,1],"Id"],";")

### making function to kill connections
kill_connections <- function(x) {
  query <- dbSendQuery(mydb, x)
  dbClearResult(query)
}

### killing other connections
lapply(queries, kill_connections)

### killing current connection
dbDisconnect(mydb)