15

根据我今天早些时候的问题,我怀疑我遇到了未关闭连接的问题,它阻止了数据被注入到我的 MySQL 数据库中。允许将数据放入当前未使用的表中(因此我怀疑许多打开的连接会阻止上传到该特定表中)。

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

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

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

(顺便说一句,如果所有其他方法都失败了,是否会简单地删除表并创建一个具有相同名称的新表来修复它?这会很痛苦,但可行。)

4

6 回答 6

25

一个。 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.names, header, field.types, quote, sep, eol. 我在 RMySQL 中也有很多奇怪的行为。我不记得细节了,但是当我做错了什么时似乎没有错误消息,比如忘记设置 row.names。高温高压

于 2013-10-18T23:26:33.367 回答
14

关闭所有活动连接:

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

执行: dbDisconnectAll()

于 2015-10-23T15:19:44.957 回答
3

最简单的:

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

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

于 2018-01-02T09:47:40.247 回答
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")
于 2016-10-15T08:10:12.263 回答
1
lapply(dbListConnections(MySQL()), dbDisconnect)
于 2019-12-11T17:42:51.157 回答
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)
于 2020-03-08T20:53:03.290 回答