You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rhino框架中使用pool包连接远程数据库后如何调用onStop关闭连接?

在Rhino架构中正确关闭pool数据库连接以避免泄漏警告

核心思路

Rhino采用模块化架构,数据库连接池的创建与销毁需要放在应用全局生命周期中管理:在应用启动时初始化一个全局连接池,在应用停止时通过onStop统一关闭,避免连接泄漏。

步骤1:封装数据库连接池模块

在Rhino项目的modules目录下新建db.R,专门处理连接池的创建与关闭逻辑:

# modules/db.R
library(pool)
library(RMariaDB)

# 创建连接池
#' @export
create_db_pool <- function() {
  pool::dbPool(
    drv = RMariaDB::MariaDB(),
    host = Sys.getenv("DB_HOST"),
    dbname = Sys.getenv("DB_NAME"),
    username = Sys.getenv("DB_USER"),
    password = Sys.getenv("DB_PASSWORD")
  )
}

# 关闭连接池
#' @export
close_db_pool <- function(pool) {
  if (pool::poolIsValid(pool)) {
    pool::poolClose(pool)
  }
}

建议将数据库配置(地址、用户名等)放在项目根目录的.env文件中,Rhino会自动加载这些环境变量,避免硬编码敏感信息。

步骤2:在应用入口绑定生命周期回调

修改项目根目录的main.R,在这里初始化连接池并注册onStop函数:

# main.R
box::use(
  shiny[shinyApp, onStop],
  modules/db[create_db_pool, close_db_pool]
)

# 初始化全局连接池
pool <- create_db_pool()

# 注册应用停止时的清理逻辑
onStop(function() {
  close_db_pool(pool)
})

# 定义UI与Server
ui <- ... # 你的UI代码(可拆分到modules/ui目录)
server <- function(input, output, session) {
  # 业务逻辑示例:调用子模块并传入连接池
  modules$data_query$server(input, output, session, pool = pool)
}

shinyApp(ui, server)

步骤3:子模块中复用连接池

在需要查询数据库的子模块中,通过参数接收全局连接池,避免重复创建:

# modules/data_query.R
box::use(
  shiny[renderTable],
  pool[dbGetQuery]
)

#' @export
server <- function(input, output, session, pool) {
  output$query_result <- renderTable({
    dbGetQuery(pool, "SELECT * FROM your_table LIMIT 20")
  })
}

关键注意事项

  • 不要在子模块内部创建连接池,否则会导致多实例重复创建连接,加剧泄漏问题。
  • 确保onStop函数绑定的是全局唯一的连接池实例,应用停止时会自动触发该回调释放所有连接。

内容的提问来源于stack exchange,提问作者Wardiam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:55:20