【问题标题】:Unable to use RJDBC at Shinyapp.io无法在 Shinyapp.io 上使用 RJDBC
【发布时间】:2018-04-24 06:42:29
【问题描述】:

我编写了一个闪亮的应用程序,它可以在我的本地机器上完美运行。我使用 RJDBC 连接到 IBM Cloud 中的 DB2 数据库。代码如下。

#Load RJDBC
dyn.load('/Library/Java/JavaVirtualMachines/jdk-9.0.4.jdk/Contents/Home/lib/server/libjvm.dylib')
# dyn.load('/Users/parthamajumdar/Documents/Solutions/PriceIndex/libjvm.dylib')
library(rJava)
library(RJDBC)

由于路径是硬编码的,我将文件 libjvm.dylib 复制到项目目录并指向它。当我这样做时,R 给出了一个致命错误。

我删除了绝对路径并替换为“./libjvm.dylib”并将应用程序部署在 ShinyApp.io 网站上。当我运行程序时,它给出了一个致命错误。

#Values for you database connection
dsn_driver = "com.ibm.db2.jcc.DB2Driver"
dsn_database = "BLUDB"            # e.g. "BLUDB"
dsn_hostname = "dashdb-entry-yp-lon02-01.services.eu-gb.bluemix.net"   # e.g. replace <yourhostname> with your hostname, e.g., "Db2 Warehouse01.datascientstworkbench.com"
dsn_port = "50000"                # e.g. "50000" 
dsn_protocol = "TCPIP"            # i.e. "TCPIP"
dsn_uid = "<UID>"              # e.g. userid
dsn_pwd = "<PWD>"            # e.g. password

#Connect to the Database
#jcc = JDBC("com.ibm.db2.jcc.DB2Driver", "/Users/parthamajumdar/lift-cli/lib/db2jcc4.jar");
jcc = JDBC("com.ibm.db2.jcc.DB2Driver", "db2jcc4.jar");
jdbc_path = paste("jdbc:db2://",  dsn_hostname, ":", dsn_port, "/", dsn_database, sep="");
conn = dbConnect(jcc, jdbc_path, user=dsn_uid, password=dsn_pwd)

同样,我将文件“db2jcc4.jar”复制到我的本地项目目录中。如果我在本地机器上指向该文件的本地项目目录,程序就可以工作。但是,当我在 ShinyApp.io 上部署时,它给出了致命错误。

请求您让我知道我需要做什么才能使应用程序在 ShinyApp.io 网站上正常运行。

当我从 Shiny 服务器运行应用程序时,错误如下:

Attaching package: ‘lubridate’

The following object is masked from ‘package:base’:

    date

Loading required package: nlme
This is mgcv 1.8-23. For overview type 'help("mgcv-package")'.
Error in value[[3L]](cond) : 
  unable to load shared object '/srv/connect/apps/ExpenseAnalysis/Drivers/libjvm.dylib':
  /srv/connect/apps/ExpenseAnalysis/Drivers/libjvm.dylib: invalid ELF header
Calls: local ... tryCatch -> tryCatchList -> tryCatchOne -> <Anonymous>
Execution halted

【问题讨论】:

  • 编辑您的问题以显示致命错误详细信息。此外,Db2 jdbc 驱动程序需要两个文件来与 Unix/Linux/Windows 版本的 Db2 通信。另一个文件是 db2jcc_license_cu.jar。
  • 尊敬的先生,当我使用我的应用程序目录中的这个文件时,程序中止。此外,在 Shiny Server 中,程序中止。
  • 问题解决了。感谢先生的耐心和帮助。我运行了这个命令:sudo R CMD javareconf。然后我运行 install.packages("rJava")。然后我注释掉了包含 dyn.load() 的行。最后,我将 db2jcc4.jar 移到了一个子目录中。现在,应用程序完美运行。

标签: r shiny db2 ibm-cloud rjdbc


【解决方案1】:

对我有用的是以下内容,它独立于操作系统。

  1. 在extdata 文件夹中的某处创建您自己的R 包,其中包含您需要的文件。例如,您的包可能是yourpackage,文件可能类似于extdata/drivers/mydriver.lib。通常,这将存储在此位置inst/extdata/drivers。详情请见http://r-pkgs.had.co.nz/inst.html。

  2. 将此包存储在 github 上,如果您想要隐私,则需要弄清楚如何授予访问令牌。

  3. 使用devtools 包来安装它。命令将是这样的,devtools::install_github("you/yourpackage", auth_token = "youraccesstoken")。在部署到 Shiny.io 之前执行一次。确保您也执行library(yourpackage)。包提交过程将解决它需要从 Github 获取。

  4. 使用以下 R 代码查找文件。 system.file('extdata/drivers/mydriver.lib, package='yourpackage')。这将为您提供文件的完整路径,您可以使用它。

【讨论】:

  • 感谢您的指导。我做了以下代码: install.packages("devtools") library("devtools") devtools::install_github("klutometis/roxygen") library(roxygen2) setwd("/Users/parthamajumdar/Documents/Solutions") create( "DriverLoader") devtools::install_github("partha6369/DriverLoader", auth_token = "") library("DriverLoader") system.file('extdata/drivers/libjvm.dylib', package='DriverLoader') 它返回一个空字符串。
  • 我认为您需要将驱动程序移至构建 R 包的物理机上的 inst/extdata/drivers。
  • 尊敬的先生,我已将其移至 inst 目录。现在,它没有给出任何输出。请指教。 > library("DriverLoader") > system.file('extdata/drivers/libjvm.dylib', package='DriverLoader') >
  • 您需要在包定义中创建一个名为inst/extdata/drivers 的文件夹并将文件移动到那里。然后,您将需要重建包。
  • 顺便说一下,我假设您正在使用 RStudio 创建 R 包。
猜你喜欢
  • 2021-09-02
  • 2019-10-02
  • 2017-04-18
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多