Java 连接到 Amazon Redshift

Posted

技术标签:

【中文标题】Java 连接到 Amazon Redshift【英文标题】:Java connect to Amazon Redshift 【发布时间】:2018-06-15 09:01:30 【问题描述】:

我正在尝试使用我的 Java 代码连接到 Amazon Redshift 数据库。我在 AWS 网站上找到了一个应该可以工作的代码 sn-p。但是,我在实现 JDBC 驱动程序时遇到了问题。 这是网站和来自网站的代码:https://docs.aws.amazon.com/redshift/latest/mgmt/connecting-in-code.html

package connection;

import java.sql.*;
import java.util.Properties;

public class Docs 
//Redshift driver: "jdbc:redshift://x.y.us-west- 
2.redshift.amazonaws.com:5439/dev";
//or "jdbc:postgresql://x.y.us-west-2.redshift.amazonaws.com:5439/dev";
static final String dbURL = "***jdbc cluster connection string ****"; 
static final String MasterUsername = "***master user name***";
static final String MasterUserPassword = "***master user password***";

public static void main(String[] args) 
    Connection conn = null;
    Statement stmt = null;
    try
       //Dynamically load driver at runtime.
       //Redshift JDBC 4.1 driver: com.amazon.redshift.jdbc41.Driver
       //Redshift JDBC 4 driver: com.amazon.redshift.jdbc4.Driver
       Class.forName("com.amazon.redshift.jdbc.Driver");

       //Open a connection and define properties.
       System.out.println("Connecting to database...");
       Properties props = new Properties();

       //Uncomment the following line if using a keystore.
       //props.setProperty("ssl", "true");  
       props.setProperty("user", MasterUsername);
       props.setProperty("password", MasterUserPassword);
       conn = DriverManager.getConnection(dbURL, props);

       //Try a simple query.
       System.out.println("Listing system tables...");
       stmt = conn.createStatement();
       String sql;
       sql = "select * from information_schema.tables;";
       ResultSet rs = stmt.executeQuery(sql);

       //Get the data from the result set.
       while(rs.next())
          //Retrieve two columns.
          String catalog = rs.getString("table_catalog");
          String name = rs.getString("table_name");

          //Display values.
          System.out.print("Catalog: " + catalog);
          System.out.println(", Name: " + name);
       
       rs.close();
       stmt.close();
       conn.close();
    catch(Exception ex)
       //For convenience, handle all errors here.
       ex.printStackTrace();
    finally
       //Finally block to close resources.
       try
          if(stmt!=null)
             stmt.close();
       catch(Exception ex)
       // nothing we can do
       try
          if(conn!=null)
             conn.close();
       catch(Exception ex)
          ex.printStackTrace();
       
    
    System.out.println("Finished connectivity test.");
 

我获得了连接凭据,但出现以下错误。

java.lang.ClassNotFoundException: com.amazon.redshift.jdbc4.Driver

这是由这一行引起的:

Class.forName("com.amazon.redshift.jdbc.Driver");

我没有在任何地方实现这个驱动程序,所以这个错误是有道理的。问题是 IntelliJ IDEA 有一个插件(数据库导航器)不能按预期工作,我无法在他们的论坛上获得任何帮助。

是否还有其他包含 JDBC 驱动程序以便代码可以使用它(在 IntelliJ 中)?

编辑:

将 JAR 添加为外部库后,我的项目如下所示:

但是,当我运行代码时,我得到了同样的错误。

【问题讨论】:

用这个来连接 Db DriverManager.registerDriver(new com.amazon.redshift.jdbc42.Driver()); Properties properties = new Properties(); properties.setProperty("user", MasterUsername); properties.setProperty("password", MasterUserPassword); this.connection = DriverManager.getConnection(this.READ_SHIFT_URL, properties); 【参考方案1】:

您可以像这样导入 Amazon Redshift JDBC 驱动程序:

点击文件 项目结构(在 Windows/Linux 上为 CTRL + SHIFT + ALT + S,在 Mac OS X 上为 ⌘ + ;) 点击左侧模块中的模块 单击依赖项 '+' → JAR

【讨论】:

这行得通。我在外部库列表中看到了驱动程序。但是我仍然遇到同样的错误。驱动程序的路径似乎是正确的。是否需要在代码中导入外部库? @JanHorčička 你写对了吗:import java.sql.*;?确保用你特别需要的替换* 不是我写的,在网站的示例代码中。我不确定我需要什么,因为我是个新手。 导入ojdbc6.jar(这是Oracle JDBC驱动程序)如何解决连接到redshift的问题? @JanHorčička 您需要将 jar 文件添加为依赖项,您似乎已经解压缩了 jar,然后 - 错误地 - 引用了 com 文件夹作为库。如果你去那个根目录,那么你应该将它的父文件夹添加为库,而不是 com 文件夹。【参考方案2】:

从以下 URL 下载 Amazon Redshift JDBC 驱动程序。

https://docs.aws.amazon.com/redshift/latest/mgmt/configure-jdbc-connection.html#download-jdbc-driver

将下载的 Jar 添加到您的类路径中。

它会起作用的。

您可以按照@Corentin 建议的步骤执行步骤#2。

【讨论】:

我按照@Corentin 的步骤进行操作。当我运行代码时,我得到了同样的错误(见更新的问题)。 Class.forName("com.amazon.redshift.jdbc.Driver"); 更改为 Class.forName("com.amazon.redshift.jdbc42.Driver"); 还要确保下载 jar `s3.amazonaws.com/redshift-downloads/drivers/jdbc/1.2.15.1025/…' 并将其添加到类路径中,我自己测试过它可以工作。

以上是关于Java 连接到 Amazon Redshift的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Spring Data ElasticsearchTemplate连接到Amazon Elasticsearch Service?

使用 SQLAlchemy 连接到 Amazon Aurora

将 IntelliJ 连接到 Amazon Redshift

如何从我的 Amazon EC2 实例中连接到 Amazon Redshift 集群

javascript 连接到Amazon Echo按钮

javascript 连接到Amazon Echo按钮