首页 > 解决方案 > 运行 AWS Redshift docker 时出现空指针异常

问题描述

我正在尝试设置 Redshift docker。每当我尝试使用我的 java 代码运行容器时,我都会收到以下异常:

Caused by: java.sql.SQLException: [Amazon][JDBC](11380) Null pointer exception.
    at com.amazon.redshift.client.PGClient.startSession(Unknown Source)
    at com.amazon.redshift.client.PGClient.<init>(Unknown Source)
    at com.amazon.redshift.core.PGJDBCConnection.connect(Unknown Source)
    at com.amazon.jdbc.common.BaseConnectionFactory.doConnect(Unknown Source)
    at com.amazon.jdbc.common.AbstractDriver.connect(Unknown Source)
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358)
    at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206)
    at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477)
    at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560)
    ... 68 common frames omitted

我有一个包含以下详细信息的属性文件:

REDSHIFT_JDBC_DRIVER_CLASS_NAME = com.amazon.redshift.jdbc42.Driver
REDSHIFT_JDBC_URL = jdbc:redshift://localhost:5439/testDb
REDSHIFT_JDBC_USERNAME=test
REDSHIFT_JDBC_PASSWORD=
REDSHIFT_JDBC_FETCH_SIZE=21

然后我使用 Hikari 来获取数据源:

public DataSource redshiftDataSource() {
   HikariConfig config = new HikariConfig();
    config.setDriverClassName(this.env.getRequiredProperty("REDSHIFT_JDBC_DRIVER_CLASS_NAME"));
    config.setJdbcUrl(this.env.getRequiredProperty("REDSHIFT_JDBC_URL"));
    config.setLeakDetectionThreshold((Long)this.env.getRequiredProperty("REDSHIFT_JDBC_LEAK_DETECTION_THRESHOLD", Long.TYPE));
    config.setMaximumPoolSize((Integer)this.env.getRequiredProperty("REDSHIFT_JDBC_MAX_POOL_SIZE", Integer.TYPE));
    config.setMinimumIdle((Integer)this.env.getRequiredProperty("REDSHIFT_JDBC_MINIMUM_IDLE", Integer.TYPE));
    config.setPoolName(this.env.getRequiredProperty("REDSHIFT_JDBC_POOL_NAME"));
    config.setUsername(this.env.getRequiredProperty("REDSHIFT_JDBC_USERNAME"));
    config.setPassword(this.env.getRequiredProperty("REDSHIFT_JDBC_PASSWORD"));
    return new HikariDataSource(config);
}

然后我在剩下的工作中使用了这个数据源。

我正在使用这个 docker 映像来测试连接:https ://hub.docker.com/r/guildeducation/docker-amazon-redshift/ 。对此的任何帮助将不胜感激。

标签: amazon-web-servicesamazon-redshift

解决方案


您似乎没有提供密码。这肯定会导致建立新连接的代码产生 NPE。

你说你有一个“属性”文件,但这看起来更像是环境变量设置。假设是这种情况,并且您docker run用于启动容器,您可以在命令行上提供密码:

docker run -d --rm -e REDSHIFT_JDBC_PASSWORD=my_secret_password CONTAINER:TAG

或者,您可以将环境设置存储在文件中,并使用--env-file参数将其提供给容器。


推荐阅读