From: Mike W. <mi...@ho...> - 2005-08-29 18:30:13
|
I'm curious whether bug 923767 "HouseKeeper thread continues after ProxoolFacade.shutdown(0)" will be fixed in 0.9.0 ? (This is something of a showstopper for our project.) Cheers Mike |
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) |
From: Bill H. <arc...@gm...> - 2005-08-29 18:36:11
|
Hi Mike, On 8/29/05, Mike Wilson <mi...@ho...> wrote:=20 I'm curious whether bug 923767 "HouseKeeper thread continues after > ProxoolFacade.shutdown(0)" will be fixed in 0.9.0 ? > (This is something of a showstopper for our project.) I'm curious too. It should be. Would you mind trying it? The latest code=20 from CVS is of release candidate quality. - Bill |