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

Shiny与JDBC交互异常:Reactive环境下Java连接失效求助

Shiny与JDBC交互的多线程兼容性问题(Java 11+)

问题现象

  • 在OpenJDK 8中无此问题,但从OpenJDK 11开始出现并影响所有更高版本;
  • 在Shiny的reactive环境内执行SQL查询会失败,而在reactive外部调用可成功;
  • 尝试在全局环境、server函数内、reactive内实例化数据库连接均无法解决问题;
  • 查看连接对象时,conn@jc在reactive外部为Java-Object{net.sourceforge.jtds.jdbc.JtdsConnection@13fee20c},在reactive内变为Java-Object{},调用rJava::.jstrVal(conn@jc)会报错;
  • 退出应用运行时,同一连接恢复功能。

问题排查推测

怀疑该问题与Shiny后端的多线程机制有关,可能存在指针偏移:外部jobj指针为<pointer: 0x556992f51450>,报错时指针为<pointer: 0x556992f51448>。

可复现代码

library(shiny)

## 使用JTDS驱动,但问题不局限于该驱动,测试微软JDBC驱动(版本12)也存在同样问题
drvr <- RJDBC::JDBC(
  driverClass = "net.sourceforge.jtds.jdbc.Driver",
  classPath = Sys.getenv("classPath"))

## 请设置对应的环境变量:用户名、密码、连接字符串
conn <- RJDBC::dbConnect(
  drv = drvr,
  user = Sys.getenv("user"),
  password = Sys.getenv("password"),
  Sys.getenv("connectionString"))

## 简单UI
ui <- bootstrapPage(plotOutput("plot"))

server <- function(input, output){

  ## 该外部调用可成功执行
  x <- RJDBC::dbGetQuery(
    conn = conn,
    statement = "select * from sys.tables")

  one <- reactive({

    ## 该reactive内的调用会抛出如下错误:
    ##   Warning: Error in .jcheck: Java Exception <no description because
    ##   toString() failed>.jcall(conn@jc, "Z", "getAutoCommit")
    ##   new("jobjRef", jobj = <pointer: 0x564bbbc301d0>, jclass =
    ##   "java/lang/Throwable")
    Y <- RJDBC::dbGetQuery(
      conn = conn,
      statement = "select * from sys.tables")
    return(1)
  })

  ## 占位输出
  output$plot <- renderPlot(plot(one()))
}

## 运行应用
shinyApp(ui = ui, server = server)

会话信息

R version 4.0.4 (2021-02-15)
 Platform: x86_64-pc-linux-gnu (64-bit)
 Running under: Debian GNU/Linux 11 (bullseye)

 Matrix products: default
 BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0
 LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0

 locale:
  [1] LC_CTYPE=C.UTF-8          LC_NUMERIC=C
  [3] LC_TIME=C.UTF-8           LC_COLLATE=C.UTF-8
  [5] LC_MONETARY=C.UTF-8       LC_MESSAGES=C.UTF-8
  [7] LC_PAPER=C.UTF-8          LC_NAME=C.UTF-8
  [9] LC_ADDRESS=C.UTF-8        LC_TELEPHONE=C.UTF-8
 [11] LC_MEASUREMENT=C.UTF-8    LC_IDENTIFICATION=C.UTF-8

 attached base packages:
 [1] stats     graphics  grDevices utils     datasets  methods   base

 other attached packages:
 [1] shiny_1.7.4

 loaded via a namespace (and not attached):
  [1] Rcpp_1.0.9       crayon_1.5.2     digest_0.6.30    later_1.3.0
  [5] mime_0.12        R6_2.5.1         DBI_1.1.3        jsonlite_1.8.3
  [9] lifecycle_1.0.3  xtable_1.8-4     magrittr_2.0.3   RJDBC_0.2-10
 [13] cachem_1.0.6     rlang_1.1.0      cli_3.4.1        promises_1.2.0.1
 [17] jquerylib_0.1.4  bslib_0.4.2      ellipsis_0.3.2   tools_4.0.4
 [21] httpuv_1.6.6     fastmap_1.1.0    compiler_4.0.4   memoise_2.0.1
 [25] rJava_1.0-8      htmltools_0.5.4  sass_0.4.2

内容的提问来源于stack exchange,提问作者C-x C-c

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:45:12