Kathey Marsden wrote:
I am moving this to derby-dev as  I think my new questions are more
appropriate for this list.
Oyvind's suggestion to make a DerbyURLClassLoader to filter out the
derby classes from the parent class loader all seems to be working ok
(with some very minimal testing).

David W. Van Couvering wrote (for Binod):


Make sure that there is only one URL classloader instance that has
access to the derby jar files. And make sure that whenever a code
accesses the datasource, it always go thru newDataSource method, then
yes, it should work.





I just want to verify that this just means that my app should use the
same loader if it needed to get another datasource for say shutting down
the database.  Other applications should be able to use their own
DerbyURLClassLoaders to access Derby as long as they are accessing
different databases, right?

I think "as long as they are accessing different Derby systems/instances" is more precise to say than different "databases".

p.s: This is all assuming that derby code doent do any other interesting
classloader mechanism inside :-). For example, it can use Thread's
context classLoader to load some other part of derby that might break.

Is there anything like Binod describes  in Derby that might cause
problems (e.g. code for loading generated byte code, loading databases
from jars or aggregates) ?

Classloaders which use the default parent classloader should not pose a problem. It's that Thread's context classloader which is spooky. I found references to getContextClassLoader in three files:

client/org/apache/derby/client/am/GetResourceInputStreamAction.java
engine/org/apache/derby/impl/services/reflect/ReflectClassesJava2.java
engine/org/apache/derby/impl/io/CPFile.java

I haven't looked at what's being done with that classloader in those files, so I can't really say whether this is an issue.

One other issue I have encountered is  that I am not sure how to handle
the derby error log (derby.log).    The configuration for this is only
provided with System properties or entries in the derby.properties file
which would affect other apps.  How do I create my own isolated error
log with out clobbering the error logs of other apps or having them
clobber mine?

Hm... create your own java.lang.System and load it with the DerbyURLClassLoader? ;o) I'm joking, of course. Are the system properties read only once, during initialization of a Derby instance? If so, you could modify the System properties before loading the next Derby instance. Of course, that requires synchronization and doesn't work in an app server with applications that don't know about each other. I don't have a good workaround for you here. The best thing would be to have some other way to set these properties than through the System properties, but if that's not available today...

--
Oyvind Bakksjo
Sun Microsystems, Database Technology Group
Trondheim, Norway
http://weblogs.java.net/blog/bakksjo/

Reply via email to