db-derby-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Kathey Marsden <kmarsdende...@sbcglobal.net>
Subject Re: Derby causing a classloader leak
Date Mon, 12 Apr 2010 23:20:20 GMT
On 4/12/2010 1:29 PM, Jason von Nieda wrote:
> Hi all,
>
>  These actions, even after the proper Derby shutdown procedures cause 
> the classloader to not be unloadable. Can someone take a look at the 
> code below and tell me if I am missing something, or is this perhaps a 
> known issue?
The important thing I think is to shutdown using the same class loader 
in which Derby is booted.   Below are some code snippets to do this.   I 
recently checked in a change to 10.6 that shows the class loader for 
boot and shutdown.  I'll be backporting that soon to 10.5.  The problem 
I have mostly seen with using the wrong class loader to shutdown is that 
a subsequent boot attempt fails.





If you don't have direct access to the class loader, you can get it from 
the connection with getClassLoader()

e.g.

     shutdownWithLoader(conn.getClass().getClassLoader());



   private static void shutdownWithLoader(ClassLoader loader) throws 
Exception {
     DataSource ds = newDataSource(loader,"");
     Class[] argType = {String.class};
     String[] args = new String[] {"shutdown"};
     Method sh = ds.getClass().getMethod("setShutdownDatabase", argType);
     sh.invoke(ds, (Object[]) args);

     try {
         ds.getConnection();
     }catch (SQLException se ) {
         if (se.getSQLState().equals("XJ015")) {
         System.out.println("Normal Shutdown");
         }
         else
         throw se;
     }

     }



     private static DataSource newDataSource(ClassLoader loader, String 
databaseName) throws Exception
     {
         DataSource ds = (DataSource) 
loader.loadClass("org.apache.derby.jdbc.EmbeddedDataSource").newInstance();
         // setDatabaseName with reflection
         Class[] argType = {String.class};
         String[] args = new String[] {databaseName};
         Method sh = ds.getClass().getMethod("setDatabaseName", argType);
         sh.invoke(ds, (Object[]) args);
         return ds;

     }



Mime
View raw message