Hi developers. I encountered the same issue, too. I got following exception. ----- java.lang.NullPointerException at org.apache.tomcat.jdbc.pool.interceptor.StatementCache$CachedStatement.closeInvoked(StatementCache.java:224) at org.apache.tomcat.jdbc.pool.interceptor.StatementDecoratorInterceptor$StatementProxy.invoke(StatementDecoratorInterceptor.java:226) at $Proxy1.close(Unknown Source) at test.PoolTestServlet.doPost(PoolTestServlet.java:30) at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:354) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379) at org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:283) at org.apache.coyote.ajp.AjpAprProtocol$AjpConnectionHandler.process(AjpAprProtocol.java:209) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1671) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) --- When the busy connection reaches abandoned time-out, PoolCleaner calls ConnectionPool#abandon() for this connection. And, reset all Interceptors that is relevant to this connection. In the case of StatementCache, null is set to cacheSize and pcon. As a result, when CachedStatement.closeInvoked is executed, cacheSize.get() causes NPE. I think that other Interceptors also have same issue.
I thought several solutions for this issue. (1) Prevent NPE at each Interceptors. (2) Create new interceptor for handling NPE, and set this interceptor to top of interceptor chain. -> In this interceptor, change RuntimeException to SQLException. I think that (2) is better than (1), because (2) doesn't depend on design of each Interceptors. On Thu, Mar 10, 2011 at 2:09 PM, Keiichi Fujino <kfuj...@apache.org> wrote: > 2011/3/4 Filip Hanik - Dev Lists <devli...@hanik.com>: >> Source and Binary Packages >> http://people.apache.org/~fhanik/jdbc-pool/v1.1.0.1/ >> >> Tag >> http://svn.apache.org/repos/asf/tomcat/tags/JDBC_POOL_1_1_0_1/ >> >> Documentation >> http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html >> >> The proposed 1.1.0.1 release is: >> >> [ ] Broken - do not release >> [ ] Alpha - go ahead and release as 1.1.0.1 Alpha >> [ ] Beta - go ahead and release as 1.1.0.1 Beta >> [X] Stable - go ahead and release as 1.1.0.1 Stable > > I tested jdbc-pool with simple applications. > And it works well. > > However, when setting removeAbandoned="true", NPE is thrown out. > It seems to occur when the Abandoned processing and SQL execution > processing are executed at the same time. > The synchronization of the Pool-Cleaner thread might not work > correctly though I am not checking the code. > > The following are logs. > =====localhost.2011-03-10.log > Mar 10, 2011 1:24:23 PM org.apache.catalina.core.StandardWrapperValve invoke > SEVERE: Servlet.service() for servlet [jdbc] in context with path > [/test] threw exception > java.lang.NullPointerException > at > org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:125) > at $Proxy9.prepareStatement(Unknown Source) > at jdbc_pool.JDBCPoolServlet.doGet(JDBCPoolServlet.java:32) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) > at > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) > at > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) > at > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) > at > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) > at > org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) > at > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) > at > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394) > at > org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) > at > org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) > at > org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) > at > java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) > at java.lang.Thread.run(Thread.java:619) > ===== > > -- > Keiichi.Fujino > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org > For additional commands, e-mail: dev-h...@tomcat.apache.org > > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org