Connecting Tech Pros Worldwide Help | Site Map

Re: Dynamic classpath

  #1  
Old June 27th, 2008, 05:17 PM
wizard of oz
Guest
 
Posts: n/a
Can you post an example of Connection.connect (String, properties)?

My java doc says java.sql.Connection is an interface and doesn't mention a
connect method.

TIA

"Thomas Kellerer" <YQDHXVLMUBXG@spammotel.comwrote in message
news:68d9soF2r6qjbU1@mid.individual.net...
Quote:
wizard of oz, 07.05.2008 10:41:
Quote:
>I have a need to have a classpath that is determined by the set of jars a
>user places into a directory.
>>
>By way of example, placing jar's into certain directories in a tomcat web
>server will cause tomcat to include them into the web applications class
>path. An example of this might be a charting package used by the web app
>to generate charts.
>>
>In my specific example, I am building a query tool and I want to be able
>to tell users to simply drop the JDBC drivers into a directory and my app
>will "pick them up". Thus there would be no need to edit the classpath.
>>
>My target environment is Java 6.0
>>
>
You will need to use a URLClassLoader to load the driver(s)
The only problem is then doing the connection as the DriverManager will
refuse to use a driver that was loaded by a different classloader.
>
You have two options to resolve this:
>
1) use Connection.connect(String, Properties) directly (bypassing
DriverManager) 2) create a wrapper class that pretends to be a driver but
delegates everything to the real instance (loaded by your own
classloader).
I am using option 1) without any problems.
>
Thomas
>
  #2  
Old June 27th, 2008, 05:17 PM
Thomas Kellerer
Guest
 
Posts: n/a

re: Re: Dynamic classpath


Sorry, I meant Driver.connect()

Once you have loaded the driver class using a URLClassLoader, you can create a new instance and cast that to a Driver and then ask the driver to connect.

Something like this:

URLClassLoader l = new URLClassLoader(...);
Class drvClass = l.loadClass("org.postgresql.Driver");
java.sql.Driver drv = (java.sql.Driver)drvClass.newInstance();
Properties props = new Properties();
props.put("user", "postgres");
props.put("password", "password");

java.sql.Connection conn = drv.connect("jdbc:postgresql:localhost/mydb", props);

Regards
Thomas



wizard of oz, 07.05.2008 13:38:
Quote:
Can you post an example of Connection.connect (String, properties)?
>
My java doc says java.sql.Connection is an interface and doesn't mention a
connect method.
>
TIA
>
"Thomas Kellerer" <YQDHXVLMUBXG@spammotel.comwrote in message
news:68d9soF2r6qjbU1@mid.individual.net...
Quote:
>wizard of oz, 07.05.2008 10:41:
Quote:
>>I have a need to have a classpath that is determined by the set of
>>jars a user places into a directory.
>>>
>>By way of example, placing jar's into certain directories in a tomcat
>>web server will cause tomcat to include them into the web
>>applications class path. An example of this might be a charting
>>package used by the web app to generate charts.
>>>
>>In my specific example, I am building a query tool and I want to be
>>able to tell users to simply drop the JDBC drivers into a directory
>>and my app will "pick them up". Thus there would be no need to edit
>>the classpath.
>>>
>>My target environment is Java 6.0
>>>
>>
>You will need to use a URLClassLoader to load the driver(s)
>The only problem is then doing the connection as the DriverManager
>will refuse to use a driver that was loaded by a different classloader.
>>
>You have two options to resolve this:
>>
>1) use Connection.connect(String, Properties) directly (bypassing
>DriverManager) 2) create a wrapper class that pretends to be a driver
>but delegates everything to the real instance (loaded by your own
>classloader).
>I am using option 1) without any problems.
>>
>Thomas
>>
>
  #3  
Old June 27th, 2008, 05:17 PM
wizard of oz
Guest
 
Posts: n/a

re: Re: Dynamic classpath


Cool, thanks.
Quote:
The only problem is then doing the connection as the DriverManager will refuse to use a driver that was loaded by a different classloader.
While I was awaiting your reply, I thought I would have a go at it myself. For what it is worth, the following also works. So the "standard method" of connecting to a database (via DriverManager) seems to work now (at least for my JDBC driver).
As mentioned I'm working in Java 6.0.


// For some reason my driver is in three parts
URL jdbc1 = new URL ("file:/classpath/jars/JDBC/tdgssconfig.jar");
URL jdbc2 = new URL ("file:/classpath/jars/JDBC/tdgssjava.jar");
URL jdbc3 = new URL ("file:/classpath/jars/JDBC/terajdbc4.jar");

// Either of the following seem to work.
// ClassLoader loader = new URLClassLoader (new URL [] { path, jdbc1, jdbc2, jdbc3 }, this.getClass().getClassLoader());
ClassLoader loader = new URLClassLoader (new URL [] { path, jdbc1, jdbc2, jdbc3 });

Class jdbcClass = loader.loadClass ("com.ncr.teradata.TeraDriver");
// The following is required otherwise I get a "No suitable driver" SQLException.
Object jdbcDriver = jdbcClass.newInstance ();

Connection c = DriverManager.getConnection("jdbc:teradata://dbc/", "uid", "pass");
Statement s = c.createStatement();
ResultSet r = s.executeQuery("select * from t1;");
while (r.next()) {
System.out.println (r.getString(1) + ", " + r.getString (2));
}
r.close ();
s.close ();
c.close ();

Thanks again for your post Thomas, it really helped point me in the right direction.

Glenn Mc


"Thomas Kellerer" <YQDHXVLMUBXG@spammotel.comwrote in message news:68dkudF2sv349U1@mid.individual.net...
Quote:
Sorry, I meant Driver.connect()

Once you have loaded the driver class using a URLClassLoader, you can create a new instance and cast that to a Driver and then ask the driver to connect.

Something like this:

URLClassLoader l = new URLClassLoader(...);
Class drvClass = l.loadClass("org.postgresql.Driver");
java.sql.Driver drv = (java.sql.Driver)drvClass.newInstance();
Properties props = new Properties();
props.put("user", "postgres");
props.put("password", "password");

java.sql.Connection conn = drv.connect("jdbc:postgresql:localhost/mydb", props);

Regards
Thomas

  #4  
Old June 27th, 2008, 05:17 PM
Lew
Guest
 
Posts: n/a

re: Re: Dynamic classpath


wizard of oz wrote:
Quote:
Cool, thanks.
Please post to Usenet in plain text, not HTML.

--
Lew
  #5  
Old June 27th, 2008, 05:17 PM
wizard of oz
Guest
 
Posts: n/a

re: Re: Dynamic classpath


Spoke too soon. The following code *does* work in a test project, but not my
main project. Both projects are built using NetBeans 6.0.

The only difference I can pick is that the main project is a Swing project,
whereas the test project doesn't use Swing. Thomas's use of Driver.connect
does however work as he advertised.

Thanks again for all of the replies.

Quote:
"wizard of oz" <nospam@gtajb.comwrote in message
news:AFsUj.8543$ko5.6998@news-server.bigpond.net.au...
Cool, thanks.
>
Quote:
The only problem is then doing the connection as the DriverManager will
refuse to use a driver that was loaded by a different classloader.
>
While I was awaiting your reply, I thought I would have a go at it myself.
For what it is worth, the following also works. So the "standard method"
of connecting to a database (via DriverManager) seems to work now (at
least for my JDBC driver).
As mentioned I'm working in Java 6.0.
>
>
// For some reason my driver is in three parts
URL jdbc1 = new URL
("file:/classpath/jars/JDBC/tdgssconfig.jar");
URL jdbc2 = new URL
("file:/classpath/jars/JDBC/tdgssjava.jar");
URL jdbc3 = new URL
("file:/classpath/jars/JDBC/terajdbc4.jar");
>
// Either of the following seem to work.
// ClassLoader loader = new URLClassLoader (new URL [] { path,
jdbc1, jdbc2, jdbc3 }, this.getClass().getClassLoader());
ClassLoader loader = new URLClassLoader (new URL [] { path,
jdbc1, jdbc2, jdbc3 });
>
Class jdbcClass = loader.loadClass
("com.ncr.teradata.TeraDriver");
// The following is required otherwise I get
a "No suitable driver" SQLException.
Object jdbcDriver = jdbcClass.newInstance ();
>
Connection c =
DriverManager.getConnection("jdbc:teradata://dbc/", "uid", "pass");
Statement s = c.createStatement();
ResultSet r = s.executeQuery("select * from t1;");
while (r.next()) {
System.out.println (r.getString(1) + ", " + r.getString
(2));
}
r.close ();
s.close ();
c.close ();
>
Thanks again for your post Thomas, it really helped point me in the right
direction.
>
Glenn Mc
>
>
"Thomas Kellerer" <YQDHXVLMUBXG@spammotel.comwrote in message
news:68dkudF2sv349U1@mid.individual.net...
Quote:
Sorry, I meant Driver.connect()

Once you have loaded the driver class using a URLClassLoader, you can
create a new instance and cast that to a Driver and then ask the driver
to connect.

Something like this:

URLClassLoader l = new URLClassLoader(...);
Class drvClass = l.loadClass("org.postgresql.Driver");
java.sql.Driver drv = (java.sql.Driver)drvClass.newInstance();
Properties props = new Properties();
props.put("user", "postgres");
props.put("password", "password");

java.sql.Connection conn = drv.connect("jdbc:postgresql:localhost/mydb",
props);

Regards
Thomas

Closed Thread


Similar Threads
Thread Thread Starter Forum Replies Last Post
On Java and C++ wellstone9912@yahoo.com answers 458 September 16th, 2006 06:55 AM
Dynamic class loading Tony Burrows answers 2 July 18th, 2005 12:47 AM
Loading Two Different Versions of the Same Class/JAR??? John Davison answers 3 July 18th, 2005 12:28 AM
Dynamic classpath for jars Alex Ostrikov answers 1 July 17th, 2005 11:23 PM