Alexei Voinovan
Alexei Voinovan

Reputation: 71

Redshift JDBC41 driver init exception

I'm working on application which connects to AWS Redshift instance via Redshift JDBC41 driver version 1.1.2.0002

Everything works fine when I run application using main(.) method, but when I try to get connection from Unit test (both TestNG and Junit) - getting exception on DataSource initialization. Here is the Redshift client class:

import com.amazon.redshift.jdbc41.DataSource;
import com.mycompany.common.config.PropertiesHelper;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
*/
public class RedshiftDBClient {

private static final Logger logger = LogManager.getLogger(RedshiftDBClient.class);

private static RedshiftDBClient instance;

private DataSource dataSource;

private Properties properties;

private RedshiftDBClient() {
}

private void initDataSource() throws IOException {


    properties = PropertiesHelper.getProperties();

    dataSource = new DataSource();
    dataSource.setUserID(properties.getProperty("rs.db.username"));
    dataSource.setPassword(properties.getProperty("rs.db.password"));
    dataSource.setURL(properties.getProperty("rs.db.url"));
}

public static synchronized RedshiftDBClient getInstance() {

    if (instance == null) {
        instance = new RedshiftDBClient();
    }

    return instance;
}

private DataSource getDataSource() throws IOException {

    if (dataSource == null) {
        initDataSource();
    }

    return  dataSource;
}

public Connection getConnection() throws SQLException, IOException {
    return getDataSource().getConnection();
}
}

And here is the error that I'm getting :

    java.lang.ClassCastException: com.amazon.redshift.jdbc41.Driver cannot be cast to com.amazon.dsi.core.interfaces.IDriver
    at com.amazon.dsi.core.impl.DSIDriverFactory.createDriver(Unknown Source)
    at com.amazon.jdbc.common.AbstractDataSource.doInitialize(Unknown Source)
    at com.amazon.jdbc.common.AbstractDataSource.getSimbaConnection(Unknown Source)
    at com.amazon.jdbc.common.AbstractDataSource.getConnection(Unknown Source)
    at com.mycompany.util.RedshiftDBClient.getConnection(RedshiftDBClient.java:60)
    at com.mycompany.model.redshift.MatchSummaryModel.save(MatchSummaryModel.java:37)
    at com.mycompany.thrift_gen.matchmaking.MatchmakingServiceHandler.ReportMatchResults(MatchmakingServiceHandler.java:59)
    at com.mycompany.thrift_gen.matchmaking.MatchmakingClientProxy$Processor$ReportMatchResults.getResult(MatchmakingClientProxy.java:499)
    at com.mycompany.thrift_gen.matchmaking.MatchmakingClientProxy$Processor$ReportMatchResults.getResult(MatchmakingClientProxy.java:484)
    at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:39)
    at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39)
    at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:285)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
11:23:55.276 [pool-2-thread-1] ERROR com.mycompany.thrift_gen.matchmaking.MatchmakingServiceHandler - Database exception
java.sql.SQLException: Error creating Driver, Driver class name incorrect.
    at com.amazon.jdbc.common.AbstractDataSource.doInitialize(Unknown Source) ~[RedshiftJDBC41-1.1.2.0002.jar:RedshiftJDBC_1.1.2.0002]
    at com.amazon.jdbc.common.AbstractDataSource.getSimbaConnection(Unknown Source) ~[RedshiftJDBC41-1.1.2.0002.jar:RedshiftJDBC_1.1.2.0002]
    at com.amazon.jdbc.common.AbstractDataSource.getConnection(Unknown Source) ~[RedshiftJDBC41-1.1.2.0002.jar:RedshiftJDBC_1.1.2.0002]
    at com.mycompany.util.RedshiftDBClient.getConnection(RedshiftDBClient.java:60) ~[classes/:?]
    at com.mycompany.model.redshift.MatchSummaryModel.save(MatchSummaryModel.java:37) ~[classes/:?]
    at com.mycompany.thrift_gen.matchmaking.MatchmakingServiceHandler.ReportMatchResults(MatchmakingServiceHandler.java:59) [classes/:?]
    at com.mycompany.thrift_gen.matchmaking.MatchmakingClientProxy$Processor$ReportMatchResults.getResult(MatchmakingClientProxy.java:499) [classes/:?]
    at com.mycompany.thrift_gen.matchmaking.MatchmakingClientProxy$Processor$ReportMatchResults.getResult(MatchmakingClientProxy.java:484) [classes/:?]
    at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:39) [libthrift-0.9.2.jar:0.9.2]
    at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39) [libthrift-0.9.2.jar:0.9.2]
    at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:285) [libthrift-0.9.2.jar:0.9.2]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_45]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_45]
    at java.lang.Thread.run(Thread.java:745) [?:1.8.0_45]
Caused by: com.amazon.support.exceptions.GeneralException: Error creating Driver, Driver class name incorrect.
    at com.amazon.dsi.core.impl.DSIDriverFactory.createDriver(Unknown Source) ~[RedshiftJDBC41-1.1.2.0002.jar:RedshiftJDBC_1.1.2.0002]
    ... 14 more

The only thing I can think of is that something is screwed up with classpath/classloader.

Upvotes: 3

Views: 3298

Answers (1)

Alexei Voinovan
Alexei Voinovan

Reputation: 71

Problem was caused by the fact that I had Postgres JDBC driver in the classpath. Redshift JDBC driver is actually Postgres JDBC driver with some additional classes and probably some refactoring. I've removed Redshift driver and using Postgres driver to access both databases, that solved the issue.

Upvotes: 2

Related Questions