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

