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]>