首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从RJDBC调用RJDBC库时rJava失败

从RJDBC调用RJDBC库时rJava失败
EN

Stack Overflow用户
提问于 2014-11-18 16:30:44
回答 1查看 366关注 0票数 1

目标:与OpenCPU AJAX调用一起使用OpenCPU。

用例:,我需要连接Apache凤凰数据库并获取一些数据。根据这些数据,我应该做分析。因此,要与菲尼克斯连接,我使用的是rjdbc(菲尼克斯不支持任何其他连接选项)。

环境: public.opencpu.org

以下是我所尝试的:

html

代码语言:javascript
复制
<textarea>
library(RJDBC)
.. do some data fetching and then r statistics
</textarea>
<br />
<button id="submitbutton" >Execute</button>
<br />
<br />
<div id="output">
</div>

javascript

代码语言:javascript
复制
<script type="text/javascript">
  //When Document is Ready
    $(function () {
        var baseurl = "https://public.opencpu.org";
        //because identity is in base
        ocpu.seturl(baseurl+"/ocpu/library/base/R");
        //actual handler
        $("#submitbutton").on("click", function(){
            //arguments
            var mysnippet = new ocpu.Snippet($("#input").val());
            //perform the request
            var req = ocpu.call("identity", {
                "x" : mysnippet
            }, function(session){
                session.getStdout(function(outtxt){
                        $("#output-txt").text(outtxt);   
                });
            });   
            //if R returns an error, alert the error message
            req.fail(function(){
                alert("Server error: " + req.responseText);
                $("#output").hide();
            });      
            req.always(function(){
                $("button").removeAttr("disabled");  
            });
        });    
    });

</script>

场景

当我单击“执行”按钮时,从文本区域(此处库(RJDBC)和一些db操作)获取用户输入的值,并发送ajax post并以以下错误进行响应

google铬控制台日志:

代码语言:javascript
复制
POST https://public.opencpu.org/ocpu/library/base/R/identity 400 (Bad Request) 
OpenCPU error HTTP 400
package 'rJava' could not be loaded

希望这能让我们更清楚。

需要确认rJava是否与OpenCPU一起工作,如果是这样的话,是否有可能解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2016-09-08 14:01:13

我的解决方案的核心如下所示。代码是从具有某些日志记录的R6类中提取的。为了记录正在发生的事情,我在private$log命令中留下了一些内容,但如果运行此代码的某个版本,您可能会忽略它。类似地,有些函数的调用并不需要完成工作,我将主机信息打包到列表中,而不是传递密码等的单个变量。简而言之,我在这里提供的代码是不可复制的。

但是,我在这个要旨提供的代码应该是可复制的(一旦您提供了数据库连接,classPathdriverClass)。这个要点已经进行了0次清理,所以里面有大量的代码,严格地说,这对完成工作来说是多余的。这些代码中没有一个是漂亮的、优雅的等等--通常我对它感到羞愧,但本着共享的精神,我还是把它放在了上面。

解释性代码段:

代码语言:javascript
复制
        jvmNode <- makeCluster(1, methods=FALSE, port = sample(11000:11999,1), rscript_args="--vanilla")
          connected <- isTRUE(try(clusterEvalQ(jvmNode, 2)==2, silent=TRUE))
        private$log$finest("forkable node started")
        clusterEvalQ(jvmNode,{library(DBI);library(rJava);library(RJDBC)})

        clusterEvalQ(jvmNode, systemRAMFree <- function() {
  #in GB, platform dependent 
  as.numeric(system('FREE_KB=$(($(echo `sed -n \'2p;3p;4p\' <  /proc/meminfo | sed "s/ \\+/ /g" | cut -d\' \' -f 2 ` | sed "s/ /+/g")));echo $FREE_KB', intern=TRUE))/1024/1024
})       
        clusterEvalQ(jvmNode, options(java.parameters = paste0("-Xmx",systemRAMFree(),"g")))

        hostInformation <- private$hostInformation
        classPath <- "~/redshift/redshiftJDBC41.jar"
        driverClass <- private$driverClass
        java.parameters <- getOption("java.parameters")
        toExportList <- list(statement,driverClass, classPath, hostInformation, java.parameters)
        names(toExportList) <- c("statement","driverClass","classPath", "hostInformation", "java.parameters")
        toExport <- as.environment(toExportList)
        clusterExport(jvmNode, ls(toExport), envir=toExport)
        clusterEvalQ(jvmNode, options(java.parameters = java.parameters))

        clusterEvalQ(jvmNode, rJava::.jinit())
        private$log$finest("JVM Started")
        clusterEvalQ(jvmNode, drv <- RJDBC::JDBC(driverClass, classPath))
        private$log$finest("Driver obtained")

        clusterEvalQ(jvmNode, conn <- dbConnect(drv, 
                                       url = hostInformation$host, 
                                       user = hostInformation$user, 
                                       password = hostInformation$password))
        private$log$debug(logPrefix("query:", statement))
        result <- try(clusterEvalQ(jvmNode, dbGetQuery(conn, statement))[[1]])
        clusterEvalQ(jvmNode, dbDisconnect(conn))
        stopCluster(jvmNode)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26999214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档