Ubuntu 18.04 RJDBC:与 Oracle 的 JDBC 连接挂起无响应

问题描述 投票:0回答:2

我使用 Oracle 数据库中的数据开发了一个闪亮的应用程序,我的应用程序在我的 Windows 环境中开发并顺利运行。为了在我的大学中部署我的应用程序,我将其编写为一个包,并将该包安装在 ubuntu 服务器上。 Ubuntu 18.04.2 LTS(GNU/Linux 4.15.0-50-通用 x86_64) Shiny 服务器已安装并找到包,应用程序正在运行。

但是当我尝试创建与 Oracle 的连接时,我的应用程序断开连接并要求我重新加载会话。

因此,我只提取了构建连接的代码并包含了几条消息,并且在使用 RJDBC 包中的 dbconnet 时它会挂起。

我检查了几个环境变量,如 PATH、JAVA_HOME、LD_LIBRARY_PATH。我几乎没有 Linux 经验。

我的R版本 R版本3.6.0(2019-04-26)——《种一棵树》 版权所有 (C) 2019 R 统计计算基金会 平台:x86_64-pc-linux-gnu(64位)

Java版本 openjdk版本“11.0.3”2019-04-16 OpenJDK运行环境(build 11.0.3+7-Ubuntu-1ubuntu218.04.1) OpenJDK 64位服务器虚拟机(build 11.0.3+7-Ubuntu-1ubuntu218.04.1,混合模式,共享)

Oracle 数据库 Oracle Database 11g 企业版版本 11.2.0.2.0 - 64 位生产版

我正在使用驱动程序 ojdbc7.jar,因为它似乎是最新版本。

    library(rJava)
    library(DBI)
    library(RJDBC)

    options(java.parameters="-Xmx2g")
    .jinit()
    print(.jcall("java/lang/System", "S", "getProperty", "java.version"))

    initialize_db_con <- function(driverClass = 'oracle.jdbc.driver.OracleDriver',
                          classPath = "pathtomyfile/ojdbc7.jar",
                          dbn = 'jdbc:oracle:thin:@xx.xx.xx.xx:xxxx/mydb',
                          usr = NULL, pwd = NULL) {
      driverClass <- 'oracle.jdbc.driver.OracleDriver'
      message("Setting user and password manually")

      creds <- list(user = usr, pw = pwd)


      drv <- RJDBC::JDBC(driverClass = driverClass, classPath = classPath, identifier.quote = '´')
      message("driver is set")
      con <- RJDBC::dbConnect(drv = drv, dbn, creds$user, creds$pw)
      message("connection has been build")
      return(con)
    }


    usr <- "myuser"
    pwd <- "mypassword"

    con <- initialize_db_con(usr=usr, pwd = pwd)

等待大约 30 秒后,出现此错误消息。

    Error in .jcall("java/sql/DriverManager", "Ljava/sql/Connection;",      "getConnection",  :
    ignoring SIGPIPE signal

为什么无法建立连接,有什么建议吗?

r ubuntu jdbc r-dbi rjdbc
2个回答
1
投票

我知道这已经很旧了,提出这个问题的用户很久以前就已经离开了,但为了以防万一有人遇到同样的问题,我将发布我的解决方案:我通过添加这一行解决了它:

options(java.parameters="-Djava.security.egd=file:///dev/urandom")
library(rJava)

显然,由于 /dev/random 的阻塞特性,Linux 上的 JDBC 驱动程序存在问题。 tcpdump 跟踪显示流量,但在“auth session”TNS 数据包后连接被卡住。 strace 显示进程已锁定,等待 /dev/random:

open("/dev/random", O_RDONLY) = 22 ... read(22, 0x7ffc27416f10, 8) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
谷歌搜索一下就完成了剩下的事情。

我已经被困在这个问题上好几天了,这就是我希望发布在这里的答案,所以就在这里。


0
投票
对于有类似问题的每个人,我想发布我的解决方案。 环境变量仅针对用户 root 设置,不适用于所有其他用户,包括来自shiny-app 的用户。

https://askubuntu.com/questions/866161/setting-path-variable-in-etc-environment-vs-profile

这个页面对于理解将 ubuntu 连接到 oracle 的过程也非常有帮助

https://edstevensdba.wordpress.com/2011/02/09/sqlnet_overview/

© www.soinside.com 2019 - 2024. All rights reserved.