6

我有一个闪亮的应用程序,它使用RPostgreSQL. 在应用程序结束时,连接已关闭,应卸载驱动程序,但出现错误,警告我连接未关闭。

代码看起来像这样:

 # in the app.R file, but not in the server function:
 drv <- dbDriver("PostgreSQL")
 con <- dbConnect(drv, dbname = "database1",
                host = "localhost", port = 5432,
                user = "user", password = "pw")

# in the server function:
foo <- dbGetQuery(con, "SELECT * from table1")

# at the end of the server function to disconnect when the app is closed:
session$onSessionEnded(function(){
    dbDisconnect(con)
    dbUnloadDriver(drv)
})

但是,我收到错误消息:Error in postgresqlCloseDriver(drv, ...): RS-DBI driver: (There are opened connections -- close them first)这与 command 一起显示dbUnloadDriver(drv)

当我手动查找打开的连接时,dbListConnections()我会得到一个列表,其中包含最多 16 个与数据库的打开连接。请注意,我只使用dbGetQueryneverdbSendQuery来避免关闭连接。

有任何想法吗?

4

2 回答 2

17

像这样构造你的代码:

function()
{
  con <- dbConnect("PostgreSQL") # + other params
  on.exit(dbDisconnect(con))

  dbGetQuery("SELECT * FROM wherever") # or whatever you want to do
}

通过使用on.exit,无论是否发生错误,都可以保证关闭连接。

另请参阅我应该如何以及何时使用 on.exit?


如果需要,可以使用以下方法卸载驱动程序:

on.exit(dbUnloadDriver(drv), add = TRUE)

我怀疑这可能会提供更差的性能,因为每次连接到数据库时都会卸载和重新加载驱动程序。如果您对此感到担心,请在您的使用条件下进行测试。

于 2015-10-13T09:34:56.367 回答
10

如果你运行 con <- dbConnect("PostgreSQL") 了不止一次,你有两个打开的连接,但con被覆盖,现在只引用第二个。快速补救措施:关闭所有打开的 PostgreSQL 连接,无论它们的名称如何:
lapply(dbListConnections(drv = dbDriver("PostgreSQL")), function(x) {dbDisconnect(conn = x)})
这将运行列表中的函数 dbDisconnect(),方法是使用驱动程序 dbDriver("PostgreSQL") 检查所有打开的连接。

于 2018-06-11T10:26:41.247 回答