commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From James House <ja...@interobjective.com>
Subject Re: [DBCP] - 2 Serious Bugs
Date Fri, 29 Mar 2002 18:00:37 GMT

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:   <mailto:commons-dev-unsubscribe@jakarta.apache.org>
> > For additional commands, e-mail: 
> <mailto:commons-dev-help@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:   <mailto:commons-dev-unsubscribe@jakarta.apache.org>
>For additional commands, e-mail: <mailto:commons-dev-help@jakarta.apache.org>


--
To unsubscribe, e-mail:   <mailto:commons-dev-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:commons-dev-help@jakarta.apache.org>


Mime
View raw message