从节点 jdbc 访问 Redshift 数据时抛出错误

Posted

技术标签:

【中文标题】从节点 jdbc 访问 Redshift 数据时抛出错误【英文标题】:Redshift data access from node jdbc throwing errors 【发布时间】:2015-09-03 05:15:58 【问题描述】:

当我尝试使用下面提到的代码从 redshift 获取数据时出现以下错误:我觉得这是由于 jdbc module 未正确安装。可能

/* * 获取用户列表。 */

var jdbc =require('jdbc');
var express = require('express');

var config = 
        libpath: '../RedshiftJDBC41-1.1.6.1006.jar',
        drivername: 'com.amazon.redshift.jdbc41.Driver',
        url: 'jdbc:redshift://exampleCluster.abcdkcmf0ug1.us-west-2.redshift.amazonaws.com:5439/xyz',
        properties: [
            ['user', 'XXXXX'],
            ['password', 'XXXXXX']
        ]
    ;

console.log(config);
var hsqldb=new jdbc(config);

hsqldb.status();
hsqldb.initialize(config, function(err, res) 

    console.log("Connection opened successfully!");


    if (err) 
console.log("Error during Initializing");
        console.log(err);
    

);


exports.list = function(req, res)


    hsqldb.open(function(err, conn) 
         if (conn) 
        // SELECT statements are called with executeQuery 
             hsqldb.executeQuery("select * from schema.table", function(err, results) 
            if (err) 
                 console.log(err);
                 else if (results) 
                  console.log(results);
                  res.type('text/plain');           // set content-type
                  res.send(results);    
                

            hsqldb.close(function(err) 
                if(err) 
                  console.log(err);
                 else 
                  console.log("Connection closed successfully!");
                
                );

                
);
         
        );
 // res.send("respond with a resource");
;

错误:

C:\Users\ABCD\node_modules\jdbc\lib\pool.js:97 返回回调(空); ^ TypeError:对象不是函数 在 C:\Users\ABCD\node_modules\jdbc\lib\pool.js:97:12 在 C:\Users\ABCD\node_modules\jdbc\node_modules\async\lib\async.js:52:16 在 C:\Users\ABCD\node_modules\jdbc\node_modules\async\lib\async.js:363:13 在 C:\Users\ABCD\node_modules\jdbc\node_modules\async\lib\async.js:52:16 完成后(C:\Users\ABCD\node_modules\jdbc\node_modules\async\lib\async.js:243:17) 在 C:\Users\ABCD\node_modules\jdbc\node_modules\async\lib\async.js:44:16 在 C:\Users\ABCD\node_modules\jdbc\node_modules\async\lib\async.js:360:17 在 C:\Users\ABCD\node_modules\jdbc\lib\pool.js:90:7 在 C:\Users\ABCD\node_modules\jdbc\lib\pool.js:28:14 在 C:\Users\ABCD\node_modules\jdbc\lib\drivermanager.js:26:18

类似帖子:Redshift data access from node jdbc

请有人告诉我这里出了什么问题。代码有问题吗?还是模块安装不正确。我觉得这是由于模块安装不正确,因为我在安装 jdbc 模块时几乎没有看到错误。

请告诉我在 node js 中安装 jdbc 模块的步骤。

【问题讨论】:

【参考方案1】:

自 0.1.1 版发布以来,node-jdbc API 已完全重新设计,因此任何与旧版本 node-jdbc 相关的旧文档,包括我对上面链接问题的回答,都不再有用。

使用 node-jdbc 0.1.1,连接数据库的代码应如下所示:

var jdbc = require('jdbc');
var jinst = require('jdbc/lib/jinst');

if (!jinst.isJvmCreated()) 
  jinst.addOption("-Xrs");
  jinst.setupClasspath(['../RedshiftJDBC41-1.1.6.1006.jar']);


var config = 
    drivername: 'com.amazon.redshift.jdbc41.Driver',
    url: 'jdbc:redshift://exampleCluster.abcdkcmf0ug1.us-west-2.redshift.amazonaws.com:5439/xyz',
    properties: 
        "user": "XXXXX",
        "password": "XXXXX"
    
;

var hsqldb=new JDBC(config);

hsqldb.status();
hsqldb.initialize(function(err, res) 
    /* ... */
);

特别是:

类路径现在配置在 jinst 对象中,并已移出配置。 properties 现在是一个对象,而不是 0.0.15 版中的 2 元素数组。 initialize 方法现在只接受一个参数,即回调。它不再将配置作为构造函数中提供的参数。 node-jdbc 应该支持在config 对象中指定userpassword 属性,从而避免为此使用properties。但是,我建议避免这样做,因为它不起作用。如果您尝试一下,您很可能会收到有关用户名和密码无效的错误,即使您输入正确也是如此。

您收到有些难以理解的错误的原因是您将配置对象传递给 initialize 方法,该方法只需要回调。直到 Node 尝试像函数一样“调用”配置对象时才会注意到该错误,这当然会失败。

【讨论】:

以上是关于从节点 jdbc 访问 Redshift 数据时抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试从 servlet 调用 JDBC 时抛出 NullPointerException

从 Redshift 卸载到 S3 时 JDBC 连接丢失。应该发生啥?

将数据从 AWS Redshift 导入到 BI Tool 的最快方法

Spark 2.0.0 使用 jdbc 从 Redshift 表中截断

在 redshift 上使用 jdbc 下载大型数据集

如何将redshift jdbc驱动程序添加到aws lambda函数