You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by James House <ja...@interobjective.com> on 2002/04/03 00:02:13 UTC
Re: [DBCP] - 2 Serious Bugs
Just curious - should I be posting bugs like this into Bugzilla, or
reporting them in this mail list?
At 3/29/2002 11:00 AM -0700, you wrote:
>Actually, the loading of the driver class is what registers it with the
>DriverManager - not the instantiation of the driver class.
>
>The following is from Dirver's doc:
>
> When a Driver class is loaded, it should create an instance of
> itself and register it with the DriverManager. This means that a
> user can load and register a driver by calling
> Class.forName("foo.bah.Driver")
>
>So in the code I outlined below, the driver IS instantiated and registered
>with the DriverManager before getDriver(url) is called.
>
>This is why many drivers have a private constructor -- because a static
>block in the driver is responsible for instantiating and registering
>itself as the class is loaded.
>
>James
>
>
>At 3/29/2002 08:57 PM +0300, you wrote:
>>The following is from DriverManager's doc:
>>
>>public static Driver getDriver(String url)
>> throws SQLException
>>
>> Attempts to locate a driver that understands the given URL. The
>>DriverManager attempts to select an appropriate driver from the
>> set of registered JDBC drivers.
>>
>>
>>So to get driver via url it must be registered first.
>>But to register it you have to have the driver's class instance!
>>
>>James House wrote:
>> >
>> > In the "BasicDataSource.createDataSource()" method, there are 2 serious
>> > bugs in the following block of code:
>> >
>> > ===========================================
>> > // Load the JDBC driver class
>> > Class driverClass = null;
>> > try {
>> > driverClass = Class.forName(driverClassName);
>> > } catch (Throwable t) {
>> > String message = "Cannot load JDBC driver class '" +
>> > driverClassName + "'";
>> > getLogWriter().println(message);
>> > t.printStackTrace(getLogWriter());
>> > throw new SQLException(message);
>> > }
>> >
>> > // Create a JDBC driver instance
>> > Driver driver = null;
>> > try {
>> > driver = (Driver) driverClass.newInstance();
>> > } catch (Throwable t) {
>> > String message = "Cannot create JDBC driver of class '" +
>> > driverClassName + "'";
>> > getLogWriter().println(message);
>> > t.printStackTrace(getLogWriter());
>> > throw new SQLException(message);
>> > }
>> > ===========================================
>> >
>> > The if method createDataSource() encounters a problem loading or
>> > instantiating the JDBC driver, it calls the method
>> > getLogWriter(). getLogWriter() in turn calls createDataSource(), thus
>> > creating an infinite loop, and a stack-overflow exception. Perhaps
>> > createDataSource() needs to simply log it's errors to stderr ???
>> >
>> > The second bug in this block of code causes the creation of the data
>> source
>> > to fail, even though there's no real problem.
>> >
>> > This problem stems from the fact that many JDBC drivers (well, at least 2
>> > that I use regularly) do not have a public constructor, and therefore you
>> > can't call newInstance() on them. (the instantiate themselves in a static
>> > {} block, as they are loaded and registered with driver manager).
>> >
>> > The EASY solution is to replace the second try block body with this call:
>> >
>> > driver = DriverManager.getDriver(url);
>> >
>> > Simple huh?
>> >
>> > If you want to "fix" the two bugs in the manner I've suggested, the
>> > replacement of the block outlined above would be:
>> > ===========================================
>> > import java.sql.DriverManager;
>> > ...
>> >
>> > // Load the JDBC driver class
>> > Class driverClass = null;
>> > try {
>> > driverClass = Class.forName(driverClassName);
>> > } catch (Throwable t) {
>> > String message = "Cannot load JDBC driver class '" +
>> > driverClassName + "'";
>> > System.err.println(message);
>> > t.printStackTrace();
>> > throw new SQLException(message);
>> > }
>> >
>> > // Create a JDBC driver instance
>> > Driver driver = null;
>> > try {
>> > driver = DriverManager.getDriver(url);
>> > } catch (Throwable t) {
>> > String message = "Cannot get a reference to JDBC driver of
>> > class '" +
>> > driverClassName + "' - " + t.getMessage();
>> > System.err.println(message);
>> > t.printStackTrace();
>> > throw new SQLException(message);
>> > }
>> > ===========================================
>> >
>> > BTW: I REALLY appreciate the recent changes that have made the pool
>> > (getConnection()) throw SQLException.
>> >
>> > James
>> >
>> > --
>> > To unsubscribe,
>> e-mail: <ma...@jakarta.apache.org>
>> > For additional commands, e-mail:
>> <ma...@jakarta.apache.org>
>>
>>--
>>Lev Assinovsky Peterlink Web
>>Programmer St. Petersburg, Russia
>>Tel/Fax: +7 812 3275343 197022 ul.Chapigina 7Á
>>E-mail: lev@peterlink.ru
>>
>>--
>>To unsubscribe, e-mail: <ma...@jakarta.apache.org>
>>For additional commands, e-mail: <ma...@jakarta.apache.org>
>
>
>--
>To unsubscribe, e-mail: <ma...@jakarta.apache.org>
>For additional commands, e-mail: <ma...@jakarta.apache.org>
>
>
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>
Re: [DBCP] - 2 Serious Bugs
Posted by "Craig R. McClanahan" <cr...@apache.org>.
On Tue, 2 Apr 2002, James House wrote:
> Date: Tue, 02 Apr 2002 15:02:13 -0700
> From: James House <ja...@interobjective.com>
> Reply-To: Jakarta Commons Developers List <co...@jakarta.apache.org>
> To: Jakarta Commons Developers List <co...@jakarta.apache.org>
> Subject: Re: [DBCP] - 2 Serious Bugs
>
>
> Just curious - should I be posting bugs like this into Bugzilla, or
> reporting them in this mail list?
>
Bugzilla is better, for two reasons:
* The reports don't get lost in mailboxes
* Everything that happens in bugzilla gets reflected to COMMONS-DEV
anyway.
Craig
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>