Search code examples
javaintellij-ideajdbcamazon-redshiftintellij-plugin

Java connect to Amazon Redshift


I am having trying to connect to Amazon Redshift Database with my Java code. I found a code snippet on AWS website that should work. However I am running into problems with implementing the JDBC driver. This is the website and the code from the website: 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.");
 }

}

I got my connection credentials, but I get a following error.

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

which is caused by this line:

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

I don't have this driver implemented anywhere so the error makes sense. The problem is that IntelliJ IDEA has a plugin for this (Database Navigator) that doesn't work as expected and I couldn't get any help on their forums.

Is there any other to include the JDBC driver so the code can work with it (in IntelliJ)?

EDIT:

After adding the JAR as an external library, my project looks like this:

Current project

However, when I run the code, I get the same error.


Solution

  • You can import the Amazon Redshift JDBC driver like this :

    • Click on File
    • Project Structure (CTRL + SHIFT + ALT + S on Windows/Linux, ⌘ + ; on Mac OS X)
    • click on modules on your left Modules
    • click on Dependencies
    • '+' → JARs