On 12.09.2014 15:29, Rick Hillegas wrote:
> On 9/12/14 3:37 AM, Rony G. Flatscher (Apache) wrote:
>> Hi there,
>>
>> tried to find this information on the Internet, but also in the derby wiki, 
>> but was not
>> successful so far, hence posting this question here where hopefully those in 
>> the know can help out.
>>
>> Using derby from Oracle's JDK 7 distribution I encountered a problem and 
>> after a loong time of
>> research, testing, trials and errors I came up with a solution, but still do 
>> not understand the
>> reason for the problem!
>>
>> Here is the problem:
>>
>>     * having a class from a jar that is placed in one of the
>>       java.ext.dirs loading the derby JDBC  (to be precise:
>>       'org.apache.derby.jdbc.EmbeddedDriver' and then issuing a
>>       newInstance()) from the classpath works, but the subsequent
>>       
>> java.sql.DriverManager.getConnection('jdbc:derby:derbyDB;create=true',props)
>>       where 'props' is a java.util.Properties with "user1/user1" and
>>       "password/user1", yields:
>>       getCause(): [java.sql.SQLException: No suitable driver found for
>> jdbc:derby:derbyDB;create=true]
>>
>> The same program works without any changes,
>>
>>     * if the jar-file loading the derby JDBC is not in java.ext.dirs
>>       but on the classpath then it works
>>     * if the jar-file and derby.jar are both in java.ext.dirs then it
>>       works
>>
>> My question is, why is this so?
>>
>> (It seems to be the case that both, the Java class that loads the derby JDBC 
>> driver and the derby
>> JDBC driver, must use the same class loader, either a 
>> sun.misc.Launcher$AppClassLoader or a
>> sun.misc.Launcher$ExtClassLoader, which is very strange as I have not 
>> encountered a similar
>> requirement/behaviour in any other use case in the past years. The thread 
>> context class loader is
>> the application class loader which, if used, would have found derby.jar 
>> given on the classpath.)
>>
>> Is there any documentation that leads to an explanation about this behaviour 
>> somewhere? Are there
>> other Java infrastructures that have such a restriction that anyone is aware 
>> of?
>>
>> ---
>>
>> Background: I am authoring a scripting language binding for Java 
>> (BSF4ooRexx) and moving the
>> BSF4ooRexx jar to a Java extension directory makes it available to all Java 
>> applications
>> including the JavaPlugins for browsers. All test and sample programs work in 
>> this setup, except
>> for the sample program that demonstrates how easy it is to use derby via 
>> JDBC! :(
>>
>> ---
>>
>> Thankful for any pointer, hints, links, explanations that shed some light 
>> into this corner!
>>
>> ---rony
>>
>>
> Hi Rony,
>
> I have not been through this code recently. Maybe someone who has studied it 
> in detail can give
> you more information.
>
> I believe that putting Derby in lib/ext will make it impossible to unload the 
> Derby classes when
> you de-register the Derby driver. This is a feature of Derby which allows 
> Derby-powered components
> (including their class definitions) to be removed from memory when they are 
> not needed. If you put
> Derby in lib/ext, then the Derby class definitions will be loaded by the 
> extension class loader.
> Those definitions will remain loaded until the extension class loader is 
> garbage collected. I
> don't think there is a way to remove all references to the extension class 
> loader and so allow it
> to be garbage collected.
>
> It makes sense that Derby class loading won't work in a situation which would 
> prevent components
> from being removed.
>
> Note that the security implications of putting Derby in lib/ext are also 
> serious. By default,
> classes loaded by the extension class loader enjoy all permissions. You would 
> not want a browser
> plugin to be able to elevate its privileges by using Derby.
>
> Hope this helps,

Hi Rick,

thank you!

Actually, what I would be after is the following scenario: have the scirpting 
language binding in
lib/ext, but derby on classpath, and everything works.

Having the scripting language binding and derby.jar on classpath works.

Having the scripting language binding in lib/ext causes classes from that jar 
to load derby.jar,
then, when using DriveManager to get a connection to derby fails in this 
scenario, unfortunately.
(It is in this step attempting to get a connection, where the exception is 
thrown.) As a result it
is currently not possible to successfully use derby.jar (on classpath) in this 
desired scenario.

I would go any length of miles to become able to do this successfully, rather 
then forcing the users
of the script programs to put derby.jar in lib/ext (or have to use 
-Djava.ext.dirs="..."), so would
be thankful for any insights and ideas.

---rony

P.S.: Having both, the scripting language binding and derby.jar in lib/ext 
works too, but this is
not desired at all.

Reply via email to