org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object
at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:114)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
at com.knowhow.laVerdad.sql.Conexion.connect(Conexion.java:71)
at com.knowhow.laVerdad.sql.Consulta.SelectMatriz(Consulta.java:323)
at com.knowhow.laVerdad.Utilidades.Utiles.Lov3(Utiles.java:195)
at org.apache.jsp.Pantallas.PantallaFastFood_jsp._jspService(PantallaFastFood_jsp.java:2931)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:308)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Thread.java:735)
Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
at org.apache.tomcat.dbcp.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1134)
at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)
Ese error (Cannot get a connection, pool error Timeout waiting for idle object) significa que el pool de conexiones DBCP de Tomcat se ha quedado sin conexiones disponibles y ha esperado el tiempo máximo configurado sin que se liberase ninguna. No es un problema de la base de datos en sí, es que tu aplicación está pidiendo conexiones más rápido de lo que las devuelve al pool.
La causa más habitual, con diferencia, es una fuga de conexiones: código que hace getConnection() pero no llama a close() en el finally (o no cierra si salta una excepción antes de llegar al cierre normal). Cada conexión que se "pierde" así queda contando como ocupada para el pool aunque nadie la esté usando, hasta que se agotan todas.
Cosas a revisar, en orden de probabilidad:
1. Busca en el código todos los getConnection() y confirma que el close() (de Connection, Statement y ResultSet) está siempre en un bloque finally, no solo al final del flujo normal.
2. Revisa el tamaño del pool en context.xml/server.xml (maxActive/maxTotal): si es muy bajo para la concurrencia real de tu app, se agota aunque no haya fugas.
3. Activa removeAbandoned="true" con un removeAbandonedTimeout razonable (por ejemplo 60 segundos) en la configuración del pool. Esto hace que DBCP recupere automáticamente conexiones que llevan abiertas más tiempo del razonable, y te sirve además como diagnóstico: en el log verás el stacktrace de dónde se abrió la conexión que se quedó colgada.
El punto 3 es el más útil para depurar esto rápido: te señala directamente la línea de código responsable en vez de tener que revisar todo a mano.
David