【发布时间】:2019-03-04 18:00:12
【问题描述】:
我有一个使用 R plumber 构建的 API,它使用 RPostgreSQL 和 pool 连接到 PostgreSQL 数据库(尽管如果我使用的是 Shiny 应用程序,这也适用):
# create the connection pool
pool <- dbPool(
drv = PostgreSQL(),
host = Sys.getenv("DB_HOST"),
port = 5432,
dbname = "db",
user = Sys.getenv("DB_USER"),
password = Sys.getenv("DB_PASSWORD")
)
# start the API
pr <- plumb("plumber.R")
# on stop, close the pool
pr$registerHooks(
list("exit" = function() { poolClose(pool) })
)
我想每天导入新数据。最简单的方法是创建一个新数据库并将其推广到生产环境:
CREATE DATABASE db_new;
-- create the tables
-- bulk-insert the data
SELECT pg_terminate_backend (pid) FROM pg_stat_activity WHERE datname = 'db';
DROP DATABASE db;
ALTER DATABASE db_new RENAME TO db;
这速度很快,并且可以最大限度地减少停机时间。问题是 pool 然后失去与数据库的连接并且不会自动尝试重新连接:
> tbl(pool, "users")
Error in postgresqlExecStatement(conn, statement, ...) :
RS-DBI driver: (could not Retrieve the result : FATAL: terminating connection due to administrator command
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
)
即使我不是每天都更换数据库,数据库服务器偶尔也会重新启动,这也会导致我的应用程序崩溃。重新连接似乎不是池、RPostgreSQL 或 DBI 的功能。有谁知道解决这个问题的方法吗?
【问题讨论】:
-
略相关:github.com/rstudio/pool/issues/72(虽然是去年发起的,但遗憾的是还没有受到关注)。
-
我们在谈论一个闪亮的应用程序吗?
-
@JonnyCrunch,它被列为管道工 API 端点,可能与闪亮的应用程序一起提供(例如,在 RStudio Connect 中),但有点不同。
-
我的建议是“observerEvent”
shiny样式,应该链接到reactive检查连接是否丢失,但我不知道这是否适用于此类问题 -
为什么不在你的连接字符串中连接到不同的数据库或公共数据库,当你发出终止命令时它不会退出你自己的会话?
标签: r postgresql r-dbi rpostgresql plumber