title: Pool empty. Unable to fetch a connection in 10 seconds
body: <p>After some time of running I'm getting this error when I stress test my servlet with at least 20 browser tabs simultaneously accessing the servlet:</p>
  
  <p><strong>java.sql.SQLException: [tomcat-http--10] Timeout: Pool empty. Unable to fetch a connection in 10 seconds, none available[size:200; busy:200; idle:0; lastwait:10000].</strong></p>
  
  <p>Here is the XML config for this:</p>
  
  <pre><code>&lt;Resource name="jdbc/MyAppHrd"
            auth="Container"
            type="javax.sql.DataSource"
            factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
            testWhileIdle="true"
            testOnBorrow="true"
            testOnReturn="false"
            validationQuery="SELECT 1"
            validationInterval="30000"
            timeBetweenEvictionRunsMillis="30000"
            maxActive="200"
            minIdle="10"
            maxWait="10000"
            initialSize="200"
            removeAbandonedTimeout="120"
            removeAbandoned="true"
            logAbandoned="false"
            minEvictableIdleTimeMillis="30000"
            jmxEnabled="true"
            jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
              org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
            username="sa"
            password="password"
            driverClassName="net.sourceforge.jtds.jdbc.Driver"
            url="jdbc:jtds:sqlserver://192.168.114.130/MyApp"/&gt;
  </code></pre>
  
  <p>What could be the problem?</p>
  
  <p><strong>Update:
  Java Code:</strong></p>
  
  <pre><code>public class MyServlet extends HttpServlet {
  
      private static final long serialVersionUID = 1L;
      private static final Log LOGGER = LogFactory.getLog(MyServlet.class);
  
     private void doRequest(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
  
          CallableStatement stmt = null;
          ResultSet rs = null;
  
          Connection conn = null;
          try {
  
              conn = getConnection();
  
              stmt = conn.prepareCall("{call sp_SomeSPP(?)}");
              stmt.setLong(1, getId());
  
              rs = stmt.executeQuery();
  
              // set mime type
              while (rs.next()) {
                  if (rs.getInt(1)==someValue()) {
                      doStuff();
                      break;
                  }
              }
              stmt = conn.prepareCall("{call sp_SomeSP(?)}");
              stmt.setLong(1, getId());
  
              rs = stmt.executeQuery();
              if (rs.next()) {
                  // do stuff
              }
  
              RequestDispatcher rd = getServletContext().getRequestDispatcher("/SomeJSP.jsp");
              rd.forward(request, response);
              return;
          } catch (NamingException e) {
              LOGGER.error("Database connection lookup failed", e);
          } catch (SQLException e) {
              LOGGER.error("Query failed", e);
          } catch (IllegalStateException e) {
              LOGGER.error("View failed", e);
          } finally {
              try {
                  if (rs!=null &amp;&amp; !rs.isClosed()) {
                      rs.close(); 
                  }
              } catch (NullPointerException e) {
                  LOGGER.error("Result set closing failed", e);
              } catch (SQLException e) {
                  LOGGER.error("Result set closing failed", e);
              }
              try {
                  if (stmt!=null) stmt.close();
              } catch (NullPointerException e) {
                  LOGGER.error("Statement closing failed", e);
              } catch (SQLException e) {
                  LOGGER.error("Statement closing failed", e);
              }
              try {
                  if (conn != null){
                      conn.close();
                      conn = null;
                  }
              } catch (NullPointerException e) {
                  LOGGER.error("Database connection closing failed", e);
              } catch (SQLException e) {
                  LOGGER.error("Database connection closing failed", e);
              }
          }
  
     }
  
      @Override
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          doRequest(request, response);
      }
  
      @Override
      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          doRequest(request, response);
      }
  
      protected static Connection getConnection() throws NamingException, SQLException {
          InitialContext cxt = new InitialContext();
          String jndiName = "java:/comp/env/jdbc/MyDBHrd";
          ConnectionPoolDataSource dataSource = (ConnectionPoolDataSource) cxt.lookup(jndiName);
          PooledConnection pooledConnection = dataSource.getPooledConnection();
          Connection conn = pooledConnection.getConnection();
          return conn; // Obtain connection from pool
      }   
  </code></pre>