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
相关产品推荐
相关产品推荐

