Reputation: 1270
i am getting the following
java.lang.ClassCastException: com.mchange.v2.c3p0.impl.NewProxyConnection
when the following code executes. could you please help me how to solve.
ComboPooledDataSource connPool = new ComboPooledDataSource();
connPool .setJdbcUrl(PropertyReader.getSystemProperty(DB_URL));
connPool .setUser(PropertyReader.getSystemProperty(DB_USER));
connPool .setPassword(Decryption.getDecryptedPwd(DB_PASSWORD));
connPool .setMaxPoolSize(MAX_POOL_SIZE);
connPool .setMaxIdleTime(MAX_IDLE_TIME);
connPool .setMinPoolSize(MIN_POOL_SIZE);
connPool .setMaxAdministrativeTaskTime(15);
java.sql.Connection conn = connPool.getConnection();
oracle.sql.CLOB c = CLOB.createTemporary(conn, false, CLOB.DURATION_SESSION);
Writer writer = c.setCharacterStream(0L);
writer.write(String.valueOf(pNoListDelimited).toCharArray());
writer.flush();
writer.close();
Exception stack trace
java.lang.ClassCastException: com.mchange.v2.c3p0.impl.NewProxyConnection
at oracle.sql.CLOB.createTemporary(CLOB.java:676)
at oracle.sql.CLOB.createTemporary(CLOB.java:640)
……
…..
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:269)
at java.util.concurrent.FutureTask.run(FutureTask.java:123)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:651)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:676)
at java.lang.Thread.run(Thread.java:595)
Upvotes: 5
Views: 7506
Reputation: 51
Unwrap your c3p0 proxy connection
java.sql.Connection conn = connPool.getConnection();
conn = conn.unwrap(OracleConnection.class);
Make sure you are properly closing you connection.
Upvotes: 4
Reputation: 602
Easiest way:
Add this dependency:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
Create a C3P0NativeJdbcExtractor:
public class C3P0NativeJdbcExtractorImpl extends C3P0NativeJdbcExtractor {
public Connection getNativeConnection(Connection con) throws SQLException {
return doGetNativeConnection(con);
}
}
Transform the original connection into nativeConnection:
Connection nativeCon = new C3P0NativeJdbcExtractorImpl().getNativeConnection(ps.getConnection());
Use nativeCon instead conn:
oracle.sql.CLOB c = CLOB.createTemporary(nativeCon, false, CLOB.DURATION_SESSION);
Upvotes: 1
Reputation: 14083
you are using Oracle-specific API that expects your Connection to be a particular Oracle Connection class. But the Connection you are working with is a c3p0 proxy Connection, not that Oracle Connection class.
if you want to use the Oracle-specific api, you have a few choices:
good luck!
Upvotes: 5