Thank you - very helpful & much appreciated. On Sat, Aug 14, 2021 at 4:24 PM Mark Thomas <ma...@apache.org> wrote:
> On 14/08/2021 01:51, Andrew Tanton wrote: > > In the Tomcat "JNDI Datasource How-To" documentation page > > < > http://tomcat.apache.org/tomcat-9.0-doc/jndi-datasource-examples-howto.html#comments_section > >, > > there is an unusually opinionated section, which discusses the Java > service > > provider (driver manager) mechanism: > > I suspect that was me after spending quite a but of time unpicking > various issues associated with DriverManager where Tomcat was getting > blamed. Goes to check the history... > > Yep. Here is the bug report: > https://bz.apache.org/bugzilla/show_bug.cgi?id=52025 > which triggered this doc update: > https://svn.apache.org/viewvc?view=revision&revision=1184919 > > > "*However, the implementation is fundamentally broken in all Java > versions > > for a servlet container environment. The problem is > > that java.sql.DriverManager will scan for the drivers only once.*" > > > > Can someone help me understand what this means in more practical terms? > > This will be a lot simpler to explain with the source code to hand: > > https://github.com/openjdk/jdk/blob/master/src/java.sql/share/classes/java/sql/DriverManager.java > > > The page goes on to say: > > > > "*...web applications that have database drivers in > > their WEB-INF/lib directory cannot rely on the service provider mechanism > > and should register the drivers explicitly.*" > > > > And, indeed, I have found that placing my JDBC driver in Tomcat's > > $CATALINA_HOME/lib > > or $CATALINA_BASE/lib will be loaded correctly, without explicit > > registration. > > > > MY QUESTIONS: > > > > (1) I don't understand why the "scan only once" limitation results in > this > > behavior - so what am I missing, here, conceptually? > > There are several inter-related elements. > > Scan once caused problems as if two web apps both have JDBC drivers then > the DriverManager scan will only load the Driver for the app that > triggers the scan first. > > An added complication is that the memory leak protection code > essentially ensures that the scan is performed by Tomcat internal code > so no JDBC drivers in WEB-INF/lib for any wweb application are seen by > the scan. Hence, the JDBC drivers need to be in CATALINA_BASE/lib. > > (2) Where is this "scan only once" behavior documented? > > It is sort of implied in the DriverManager Javadoc but you need to read > the source code to get a clear picture. > > > (3) What is it about a servlet container environment which allows this > > problem to exist? > > Dynamic loading and unloading of web applications and use of a dedicated > class loader per web application. > > You can also get various memory leaks associated with DriverManager as > well (which Tomcat automatically protects you against). > > Mark > > > > > > Thank you. > > > > For reference, here is the documentation link I used above: > > > > > > > http://tomcat.apache.org/tomcat-9.0-doc/jndi-datasource-examples-howto.html > > > > (The wording in the documentation has been this way for several Tomcat > > versions, going back a few years.) > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org > For additional commands, e-mail: users-h...@tomcat.apache.org > >