首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RPostgreSQL无法关闭连接

RPostgreSQL无法关闭连接
EN

Stack Overflow用户
提问于 2015-10-13 17:24:07
回答 2查看 11.8K关注 0票数 6

我有一个闪亮的应用程序,使用RPostgreSQL连接到数据库。在应用程序结束时,连接被关闭,驱动程序应该被卸载,但我得到了一个错误,警告我连接没有关闭。

代码看起来像这样:

代码语言:javascript
复制
 # 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)这是用命令dbUnloadDriver(drv)显示的。

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

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-13 17:34:56

像这样组织你的代码:

代码语言:javascript
复制
function()
{
  con <- dbConnect("PostgreSQL") # + other params
  on.exit(dbDisconnect(con))

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

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

另请参阅How and when should I use on.exit?

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

代码语言:javascript
复制
on.exit(dbUnloadDriver(drv), add = TRUE)

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

票数 17
EN

Stack Overflow用户

发布于 2018-06-11 18:26:41

如果多次运行con <- dbConnect("PostgreSQL"),则有两个打开的连接,但con已被覆盖,现在仅引用第二个连接。快速补救措施:关闭所有打开的PostgreSQL连接,不管它们的名称是什么:

lapply(dbListConnections(drv = dbDriver("PostgreSQL")), function(x) {dbDisconnect(conn = x)})

这将通过检查所有打开的与驱动程序dbDriver("PostgreSQL")的连接来运行列表上的函数dbDisconnect()。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33098894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档