Article updated on

How to Monitor a Tomcat JDBC Connection pool from a Servlet Example

With this example you can find out  the active, idle  connections,  etc. from a tomcat connection pool. This is very useful to know if you are not closing all your connections or if you want to double check how the pool is working.

MonitorServlet.java

import java.io.PrintWriter;
import java.lang.management.ManagementFactory;
import java.util.Set;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanInfo;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/poolmonitor")
public class MonitorServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.println("<!DOCTYPE html>");
        writer.println("<html>");
        writer.println("<body>");
        writer.println("<p><h1>Tomcat Pool</h1></p><p>");
        try {
            MBeanServer server = ManagementFactory.getPlatformMBeanServer();
            Set<ObjectName> objectNames = server.queryNames(null, null);
            for (ObjectName name : objectNames) {
                MBeanInfo info = server.getMBeanInfo(name);
                if (info.getClassName().equals(
                        "org.apache.tomcat.jdbc.pool.jmx.ConnectionPool")) {
                    for (MBeanAttributeInfo mf : info.getAttributes()) {
                        Object attributeValue = server.getAttribute(name,
                                mf.getName());
                        if (attributeValue != null) {
                            writer.println("" + mf.getName() + " : "
                                    + attributeValue.toString() + "<br/>");

                        }
                    }
                    break;
                }
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        writer.println("</p></body>");
        writer.println("</html>");
    }
}

 

Context.xml (Tomcat Pool example)

    <Resource auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver"
       maxActive="50"
       maxIdle="5"
       minIdle="1"
       maxWait="30000"
       validationQuery="select 1 from dual"
       validationQueryTimeout="3"
       testWhileIdle="true"
       testOnBorrow="true"
       testOnReturn="false"
       validationInterval="30000"
       timeBetweenEvictionRunsMillis="30000"
       removeAbandoned="true"
       removeAbandonedTimeout="600"
       name="jdbc/test"
       password="test"
       type="javax.sql.DataSource"
       factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
       url="jdbc:oracle:thin:@myoracleexample:1521:MYORACLE"
       username="test"
     />

 

img/1/111/uno.png

Notes

  • This example read the tomcat pool MBeans which follow the JMX specification.
  • You can also use JConsole to monitor all the JMX beans available.

img/1/111/dos.png