File APIs for Java Developers
Manipulate DOC, XLS, PPT, PDF and many others from your application.
http://aspose.com/file-tools
The moose likes JDBC and the fly likes Apache Commons DBCP connection object problem Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Databases » JDBC
Bookmark "Apache Commons DBCP connection object problem" Watch "Apache Commons DBCP connection object problem" New topic
Author

Apache Commons DBCP connection object problem

Harvinder Thakur
Ranch Hand

Joined: Jun 10, 2008
Posts: 231
Hi

I am using Apache Commons DBCP (commons-dbcp-1.2.2.jar) Connection pool.

Once i obtain a connection from the pool it is wrapped in the
class org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.

My requirement is to pass an array of Strings to pl/sql stored procedure in Oracle.

Here is what i am doing in the following code snippet:

Connection conn = ConnectionManager.ds.getConnection();
//The above statement returns me an connection wrapped in the class
//org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.

DelegatingConnection delegate_conn = new DelegatingConnection(conn);
//Obtain an object of class DelegatingConnection to get a reference to the
//actual underlying connection object using the getDelegate() method.

ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor( "OTA_MSGIDS_STRING_ARRAY", delegate_conn.getDelegate() );
//Pass the actual underlying connection object to the above
//createDescriptor() method because the wrapped connection object as
//mentioned above is not accepted by the createDescriptor() method.

ARRAY array_to_pass = new ARRAY( descriptor, delegate_conn.getDelegate(), arrOta_Message_Ids_Offered );
//Pass the actual underlying connection object to the above
//ARRAY() constructor because the wrapped connection object as
//mentioned above is not accepted by the ARRAY() constructor.

CallableStatement c_stmt = conn.prepareCall("begin update_message_ids_ota
(:x); end;" );
c_stmt.setArray( 1, array_to_pass );
c_stmt.execute();


On executing the above code, I get the following exception:

java.lang.ClassCastException: org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper cannot be cast to oracle.jdbc.OracleConnection
at oracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:91)


Obviously, the reason above is that even though i am sending the underlying connection object but the code in createDescriptor() method is testing the connection object instance against an OracleConnection which it is not.

How can i use the Connection object returned by the Apache Commons DBCP connection pool to be compatible with the Connection object expected by
ArrayDescriptor.createDescriptor(String str1, Connection conn1); method?


Any help is deeply appreciated.
[ December 08, 2008: Message edited by: Harvinder Thakur ]

thanks
Harvinder
Harvinder Thakur
Ranch Hand

Joined: Jun 10, 2008
Posts: 231
Hey guys, anybody got an answer. Also i am using the apache commons dbcp library in a standalone application i.e. no application/web server
[ December 08, 2008: Message edited by: Harvinder Thakur ]
Harvinder Thakur
Ranch Hand

Joined: Jun 10, 2008
Posts: 231
Got the solution ranchers,

Here it is:
((DelegatingConnection)conn).getInnermostDelegate(); will give you the underlying Connection Object. ;)
Pravin Sharma
Greenhorn

Joined: Jun 18, 2009
Posts: 11
Hi Harvinder,
You have mentined that you got solution for above problem.
I am using the same solution,but still i am getting that problem.
I am using JdbcTemplate of spring framework to get connection.
Following is what i am doing:

Connection conn = jdbcTemplate.getDataSource().getConnection();
OracleConnection ocon = ((DelegatingConnection) conn).getInnermostDelegate();

In abve cas i got null reference.

if try with getDelegate method i got the wraaper object so it is giving classcast exception.
java.lang.ClassCastException: org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper cannot be cast to oracle.jdbc.OracleConnection

Please Help me out.
Joshi Avadhut
Greenhorn

Joined: May 13, 2008
Posts: 15
Hi,

I am new to using DBCP..I am using more than one datasources for the application and I want to obtain the connection object of particular datasource.. In this case do I need to write my ConnectionManager class or it is provided by DBCP. How do I handle this..please help.




Avadhut Joshi
chillax arora
Greenhorn

Joined: Jan 26, 2011
Posts: 1
Somebody please reply asap.
I used
if(con instanceof tomcat.dbcp.dbcp.DelegationConnection ) before applying delegation connection to make oracle .jdbc.oracleconnection and it is returning fa;lse.
If I dont use this 'if' statement and directly use Delegation Connection statement,then an exception is thrown:cant convert tomcat.dbcp.dbcp.PoolableConnection$PoolableConnection Wrapper to tomcat.dbcp.dbcp.Delegation Connection.Please please somebody guide me asap.
Michael Munsey
Greenhorn

Joined: Feb 08, 2012
Posts: 2
Bumping an old thread...
The answer to this question can be found at http://stackoverflow.com/a/6489566
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: Apache Commons DBCP connection object problem