防止来自 RStudio 的持久数据库连接

Posted

技术标签:

【中文标题】防止来自 RStudio 的持久数据库连接【英文标题】:Prevent Persistent Database Connections from RStudio 【发布时间】:2020-08-16 06:55:01 【问题描述】:

我有一个 Redshift 数据库,我在一个由 Jupyter Notebooks 证实的 Docker 映像中运行 RStudio。

我添加了 ODBC 驱动程序并安装了 odbc 包作为启动 Docker 实例的命令的一部分。

我担心的是我最终与数据库有太多打开的连接。

我担心有许多长期存在的连接,因为它们可能会锁定我的表。我查看了 odbc 和 RPostgreSQL 的文档,但没有看到任何关于超时或清除所有连接的方法。

如何防止从 RStudio 到 PostgreSQL 的长期连接过多?

【问题讨论】:

这取决于应用程序和服务器配置。如果应用程序没有在需要时关闭连接,没有做足够的tryCatch 和/或on.exit 工作以确保连接处于预期状态,那么事情可能会“悬空”。如果服务器让 R 进程运行应用程序的时间过长,那么具有许多连接的应用程序可能会存在很长时间。您可能会考虑使用 pool 包,尽管它不足以替代连接管理。 太棒了!您对允许事物悬挂的数据库的描述是准确的。我可以将poolodbc 一起使用吗? 是的,您提供给pool 的参数会直接传递给您喜欢使用的任何(DBI) 驱动程序,其中odbc。 (我每天都使用那个组合。) 太棒了!您想将其添加为答案,以便我将其标记为正确吗? 【参考方案1】:

我的偏好和解决方案是使用pool 包来管理连接。我不需要有一个大的连接“池”来受益于它的一项功能:超时重新连接。

使用很简单。与大多数其他DBI 驱动程序类似,您不需要library(pool),只需在打开时参考即可。

如果您最初的公开电话是:

library(DBI)
con <- dbConnect(odbc::odbc(), driver = "ODBC Driver 17 for SQL Server",
                 server = "somehost,1433", uid = "someuser", pwd = "secret",
                 database = "umptysquat")

然后改为使用:

con <- pool::dbPool(odbc::odbc(), driver = "ODBC Driver 17 for SQL Server",
                    server = "somehost,1433", uid = "someuser", pwd = "secret",
                    database = "umptysquat", minSize = 1, maxSize = 5)

(替换 minSizemaxSize 的有意义的数字)。从这里开始,DBI::dbGetQuery(con, "select 1 as a") 就像它是真实的一样工作。对我来说,真正的好处之一是当连接关闭时(出于任何原因,包括超时和我的 ssh 隧道发生故障),池连接会在下一次查询时自动重新连接。

大多数功能按原样工作,但偶尔(我现在无法回忆或重现)我不得不为某些 DBI 功能执行library(pool);library(odbc)。再次,不记得了,这可能是无关的。加载它们通常不是问题(如果可以避免的话,我只是不想附加太多的包)。

【讨论】:

我没有将其标记为完成,因为它不能解决问题。事实证明,RStudio 是在单独的 Docker 映像中加载的,所以 pool 将不起作用。 是否可以为数据库连接添加超时时间? shiny.rstudio.com/articles/pool-advanced.html 建议idleTimeout= odbc 本身接受timeout= 参数,cran.r-project.org/web/packages/odbc/odbc.pdf 太棒了! odbc 超时似乎适用于与数据库 Time in seconds to timeout the connection attempt. Setting a timeout ofInfindicates no timeout. (defaults to 10 seconds). 的连接速度较慢的情况@

以上是关于防止来自 RStudio 的持久数据库连接的主要内容,如果未能解决你的问题,请参考以下文章

LVS 持久连接

LVS 持久连接

r [连接到Rstudio中的SQLite数据库] #R #SQLite #RStudio

ubuntu18.04 Rstudio-server无法连接服务器

使用 Rstudio windows 中的 R rJDBC 包连接到 hive(启用了 kerbero)

使用 RStudio 连接到本地存储的压缩 SQL 数据库并在其上运行查询