防止来自 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
包,尽管它不足以替代连接管理。
太棒了!您对允许事物悬挂的数据库的描述是准确的。我可以将pool
与odbc
一起使用吗?
是的,您提供给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)
(替换 minSize
和 maxSize
的有意义的数字)。从这里开始,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 的持久数据库连接的主要内容,如果未能解决你的问题,请参考以下文章
r [连接到Rstudio中的SQLite数据库] #R #SQLite #RStudio
ubuntu18.04 Rstudio-server无法连接服务器