|
From: Mike W. <mi...@ho...> - 2005-09-07 21:07:12
|
Hi Bill,
Doing some more testing on the latest code I realized I was getting
exceptions when debugging my Weblogic project from Eclipse. Using your
proxool snapshot I am getting
java.lang.NoClassDefFoundError: org/logicalcobwebs/cglib/proxy/Factory
from inside the Proxool code.
The reason seems to be when the cglib code is creating the proxy instance
for the Oracle connection, it is using the wrong classloader. Scenario:
- ReflectUtils.defineClass() wants to know the classloader to use.
- getClassLoader() returns the value of getDefaultClassLoader().
- getDefaultClassLoader() fetches the classloader from the first
interface (as there is no superclass), see code:
protected ClassLoader getDefaultClassLoader() {
if (superclass != null) {
return superclass.getClassLoader();
} else if (interfaces != null) {
return interfaces[0].getClassLoader();
} else {
return null;
}
}
During my test runs it has sometimes been copied from
oracle.sql.BfileDBAccess and sometimes from
oracle.sql.internal.OracleConnection and they both belong to the
"application global" sun.misc.Launcher$AppClassLoader.
- Using this classloader, the JVM will fail in locating the proxool
Factory interface (to be implemented by the gclib proxy instance)
as proxool.jar is only reachable from the webapp's own classloader.
If I understand it correctly, the 0.8.3 version of proxool always specified
a proxool defined superclass for proxy instances. This meant proxy instances
would be created with the same classloader as was used to load proxool
(because of the code in getDefaultClassLoader), and proxool classes would
then always be found through this loader.
So, to summarize, the old version of proxool was basing its classloader
choice for proxies on a proxool class (Proxy?) while the new version will
use the classloader of the first implemented interface. And in my scenario
these point to different loaders.
I think the new proxool code should be updated to make a safer choice on
what classloader to choose for its proxies. It would probably be safer to
use the classloader used to load proxool as is in practice done in the old
version.
I think many users with application servers will stumble on this bug so it
should be thought through...
See stacktrace below.
Actually, I was at first puzzled by the Oracle interfaces (and
T4CConnection) belonging to the global classloader despite that we are
supplying the Oracle JDBC driver in the webapp's WEB-INF/lib. This happens
with both proxool 0.8.3 and 0.8.9.
I found out that the Oracle drivers bundled with Weblogic are always visible
in the application classpath and take precedence over the ones in the webapp
(even though we are not using Weblogic's connection pools), and are
therefore defined on the global application classloader.
It is possible to change this precedence behaviour by setting
<prefer-web-inf-classes>true</prefer-web-inf-classes>
in weblogic.xml, but this has other drawbacks.
Best regards
Mike
Exception: org.logicalcobwebs.cglib.core.CodeGenerationException:
java.lang.reflect.InvocationTargetException-->null
[0]
org.logicalcobwebs.cglib.core.AbstractClassGenerator.create(AbstractClassGen
erator.java:206)
[1] org.logicalcobwebs.cglib.proxy.Enhancer.createHelper(Enhancer.java:331)
[2] org.logicalcobwebs.cglib.proxy.Enhancer.create(Enhancer.java:247)
[3] org.logicalcobwebs.cglib.proxy.Enhancer.create(Enhancer.java:407)
[4]
org.logicalcobwebs.proxool.ProxyFactory.getWrappedConnection(ProxyFactory.ja
va:60)
[5]
org.logicalcobwebs.proxool.ConnectionPool.getConnection(ConnectionPool.java:
268)
[6] org.logicalcobwebs.proxool.ProxoolDriver.connect(ProxoolDriver.java:89)
[7] java.sql.DriverManager.getConnection(DriverManager.java:512)
[8] java.sql.DriverManager.getConnection(DriverManager.java:193)
[9]
net.sf.hibernate.connection.ProxoolConnectionProvider.getConnection(ProxoolC
onnectionProvider.java:51)
[10]
net.sf.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:84)
[11]
net.sf.hibernate.cfg.Configuration.buildSettings(Configuration.java:1172)
[12]
net.sf.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:80
3)
<snip>
[20]
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProces
sor.java:421)
[21]
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
[22] org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
[23] org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)
[24] javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
[25] javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
[26]
weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(Servle
tStubImpl.java:996)
[27]
weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java
:419)
[28] weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:28)
[29]
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27)
[30] HibernateFilter.doFilter(HibernateFilter.java:107)
[31]
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27)
[32]
weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(W
ebAppServletContext.java:6458)
[33]
weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubjec
t.java:321)
[34]
weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
[35]
weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletCo
ntext.java:3661)
[36]
weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java
:2630)
[37] weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:219)
[38] weblogic.kernel.ExecuteThread.run(ExecuteThread.java:178)
Cause: java.lang.reflect.InvocationTargetException
Cause [0] sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Cause [1]
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39
)
Cause [2]
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl
java:25)
Cause [3] java.lang.reflect.Method.invoke(Method.java:324)
Cause [4]
org.logicalcobwebs.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:373
)
Cause [5]
org.logicalcobwebs.cglib.core.AbstractClassGenerator.create(AbstractClassGen
erator.java:193)
Cause [6]
org.logicalcobwebs.cglib.proxy.Enhancer.createHelper(Enhancer.java:331)
Cause [7] org.logicalcobwebs.cglib.proxy.Enhancer.create(Enhancer.java:247)
Cause [8] org.logicalcobwebs.cglib.proxy.Enhancer.create(Enhancer.java:407)
Cause [9]
org.logicalcobwebs.proxool.ProxyFactory.getWrappedConnection(ProxyFactory.ja
va:60)
Cause [10]
org.logicalcobwebs.proxool.ConnectionPool.getConnection(ConnectionPool.java:
268)
Cause [11]
org.logicalcobwebs.proxool.ProxoolDriver.connect(ProxoolDriver.java:89)
Cause [12] java.sql.DriverManager.getConnection(DriverManager.java:512)
Cause [13] java.sql.DriverManager.getConnection(DriverManager.java:193)
Cause [14]
net.sf.hibernate.connection.ProxoolConnectionProvider.getConnection(ProxoolC
onnectionProvider.java:51)
Cause [15]
net.sf.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:84)
Cause [16]
net.sf.hibernate.cfg.Configuration.buildSettings(Configuration.java:1172)
Cause [17]
net.sf.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:80
3)
<snip>
Cause [25]
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProces
sor.java:421)
Cause [26]
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
Cause [27]
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
Cause [28]
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)
Cause [29] javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
Cause [30] javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
Cause [31]
weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(Servle
tStubImpl.java:996)
Cause [32]
weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java
:419)
Cause [33] weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:28)
Cause [34]
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27)
Cause [35] HibernateFilter.doFilter(HibernateFilter.java:107)
Cause [36]
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27)
Cause [37]
weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(W
ebAppServletContext.java:6458)
Cause [38]
weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubjec
t.java:321)
Cause [39]
weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
Cause [40]
weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletCo
ntext.java:3661)
Cause [41]
weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java
:2630)
Cause [42] weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:219)
Cause [43] weblogic.kernel.ExecuteThread.run(ExecuteThread.java:178)
Cause: java.lang.NoClassDefFoundError:
org/logicalcobwebs/cglib/proxy/Factory
Cause [0] java.lang.ClassLoader.defineClass0(Native Method)
Cause [1] java.lang.ClassLoader.defineClass(ClassLoader.java:539)
Cause [2] java.lang.ClassLoader.defineClass(ClassLoader.java:382)
Cause [3] sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Cause [4]
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39
)
Cause [5]
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl
java:25)
Cause [6] java.lang.reflect.Method.invoke(Method.java:324)
Cause [7]
org.logicalcobwebs.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:373
)
Cause [8]
org.logicalcobwebs.cglib.core.AbstractClassGenerator.create(AbstractClassGen
erator.java:193)
Cause [9]
org.logicalcobwebs.cglib.proxy.Enhancer.createHelper(Enhancer.java:331)
Cause [10] org.logicalcobwebs.cglib.proxy.Enhancer.create(Enhancer.java:247)
Cause [11] org.logicalcobwebs.cglib.proxy.Enhancer.create(Enhancer.java:407)
Cause [12]
org.logicalcobwebs.proxool.ProxyFactory.getWrappedConnection(ProxyFactory.ja
va:60)
Cause [13]
org.logicalcobwebs.proxool.ConnectionPool.getConnection(ConnectionPool.java:
268)
Cause [14]
org.logicalcobwebs.proxool.ProxoolDriver.connect(ProxoolDriver.java:89)
Cause [15] java.sql.DriverManager.getConnection(DriverManager.java:512)
Cause [16] java.sql.DriverManager.getConnection(DriverManager.java:193)
Cause [17]
net.sf.hibernate.connection.ProxoolConnectionProvider.getConnection(ProxoolC
onnectionProvider.java:51)
Cause [18]
net.sf.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:84)
Cause [19]
net.sf.hibernate.cfg.Configuration.buildSettings(Configuration.java:1172)
Cause [20]
net.sf.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:80
3)
<snip>
Cause [28]
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProces
sor.java:421)
Cause [29]
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
Cause [30]
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
Cause [31]
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)
Cause [32] javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
Cause [33] javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
Cause [34]
weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(Servle
tStubImpl.java:996)
Cause [35]
weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java
:419)
Cause [36] weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:28)
Cause [37]
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27)
Cause [38] HibernateFilter.doFilter(HibernateFilter.java:107)
Cause [39]
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27)
Cause [40]
weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(W
ebAppServletContext.java:6458)
Cause [41]
weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubjec
t.java:321)
Cause [42]
weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
Cause [43]
weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletCo
ntext.java:3661)
Cause [44]
weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java
:2630)
Cause [45] weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:219)
Cause [46] weblogic.kernel.ExecuteThread.run(ExecuteThread.java:178)
|