通过这个例子,你可以从一个 tomcat 连接池中找出活跃的、空闲的连接等等。这对于了解您是否没有关闭所有连接或是否要仔细检查池的工作方式非常有用。
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 池示例)
<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"
/>

笔记
- 此示例读取遵循JMX 规范的 tomcat 池MBean。
- 您还可以使用 JConsole 来监视所有可用的 JMX bean。

本文介绍如何通过MonitorServlet监控Tomcat连接池,展示活跃、空闲连接,并利用JMX和JConsole进行实时管理。实例代码和配置文件说明了如何获取和解读关键池参数。

1107

被折叠的 条评论
为什么被折叠?



