- If I have this right, the exceptionFactory doesn't get initialized until the
first instance of InternalDriver() is created. Isn't it possible that
getExceptionFactory() will return null? Doesn't this mean that at some point
during pre-boot I'll get a NullPointerException if I try to throw a
SQLException? Is this something that could happen, or are all SQLExceptions
guaranteed to be thrown only after at least one instance of InternalDriver has
been created?
No the boot method is called from the static initializer of
EmbeddedDriver, so the factory will get initialized when the driver
class is loaded. I was under assumption that there is no situation which
may cause SQLException before the driver is booted. Looking at the code
it appears the SQLException is thrown only after the boot is successful
and all the method coming in the execution chain of boot throw Standard
Exception.
Once the boot method is call the exception factory will be available to
all the classes even if the boot fails.
Perhaps this is not an issue, but the pattern I proposed in my email does not
have this potential timing bug, where the exception factory is created as part
of the static initializer for the InternalDriver class. I also question
whether it needs to be part of the InternalDriver at all, looking at the code,
there appears to be no dependency on the data or behavior of InternalDriver.
Usually for a singleton pattern like this you see something like this
(independent from InternalDriver, and with no dependencies on boot timing):
I had used a similar approach in my first patch (checking for jvm
version). But checking jvm info wasn't a good idea (its already been
checked while loading the Driver), so Dan suggested to use the
InternalDriver to get the correct Exception Factory.
Using InternalDriver for getting the exception factory has added
advantage of not using reflection to load and instantiate exception
factory which I will need if I try to check jvm version and create
ExceptionFactory for that version.
anurag