On Monday 21 December 2009 12:04:59 Mark Thomas wrote:
> On 21/12/2009 10:53, Rainer Frey wrote:
[...]
> > but I hoped that someone would take a
> > look at issue https://issues.apache.org/bugzilla/show_bug.cgi?id=48214
> > before a release is made
>
> I hadn't forgotten that one - I just hadn't got around to looking at it.
> I have a few ideas about what might be going on.
I assumed so, but I was afraid there wouldn't be time before the release.
> My guess is that you are relying on the auto-driver registration
> process. It is this process that triggers the memory leak so Tomcat now
> forcibly de-registers any drivers the JVM auto-registers.
I do, mostly on the presence of a static initializer block in the driver
class, as most drivers that we use do not yet implement JDBC4 fully.
What exactly is the memory leak? Is relying on the auto-registration
discouraged altogether, or is the service definition method of JDBC 4 safe?
> If you get a chance before I get to it later today, try using a context
> listener to register and de-register the driver when your app starts and
> stops and let us know how you get on.
I implemented the ServletContextListener below, and I don't get any exceptions
anymore. But I'm not sure about this thing. Are drivers required by spec to
provide a public parameterless constructor, and is it safe to create and
manage instances of a Driver on my own? Or do I need a separate instantiation
mechanism for each supported driver? I always regarded these things as
internal to the driver implementation. Maybe you were thinking of a different
approach to deregister and register a driver that I just don't see?
Here's the code (minus exception handling and logging):
public class JdbcDriverRegistrationListener implements ServletContextListener
{
private Driver driver;
public void contextInitialized( ServletContextEvent evt )
{
ServletContext context = evt.getServletContext();
String driverName = context.getInitParameter( "jdbc.driver" );
try
{
Class<Driver> driverClass = (Class<Driver>)Class.forName( driverName );
this.driver = driverClass.newInstance();
DriverManager.registerDriver( this.driver );
}
catch( Exception x )
{}
}
public void contextDestroyed( ServletContextEvent evt )
{
DriverManager.deregisterDriver( this.driver );
}
}
> Cheers,
>
> Mark
Rainer
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]