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:[EMAIL PROTECTED]> > > For additional commands, e-mail: > <mailto:[EMAIL PROTECTED]> > >-- >Lev Assinovsky Peterlink Web >Programmer St. Petersburg, Russia >Tel/Fax: +7 812 3275343 197022 ul.Chapigina 7Á >E-mail: [EMAIL PROTECTED] > >-- >To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> >For additional commands, e-mail: <mailto:[EMAIL PROTECTED]> -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>