Driver Exception for Redshift JDBC41
I am working on an application that connects to an AWS Redshift instance using Redshift JDBC41 driver version 1.1.2.0002
Everything works fine when I run the application using the method main(.)
, but when I try to get the connection from Unit test (both TestNG and Junit) - getting an exception when initializing the DataSource. 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 I am 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 it has something to do with classpath / classloader.
source to share
The problem was caused by the fact that I had a Postgres JDBC driver on the classpath. The Redshift JDBC driver is actually a Postgres JDBC driver with some extra classes and probably some refactorings. I removed the Redshift driver and used the Postgres driver to access both databases, which solved the problem.
source to share