Tomcat 连接池 MBean 并不总是出现在扫描中

Posted

技术标签:

【中文标题】Tomcat 连接池 MBean 并不总是出现在扫描中【英文标题】:Tomcat connection pool MBeans don't always show up in scan 【发布时间】:2021-02-16 10:54:11 【问题描述】:

我正在使用一些代码来监控我的 Tomcat (9) 连接池。但是,当我扫描数据源 MBean 时,返回的结果并不一致。有没有人解释为什么会这样?

有时我会得到三个 MBean(数据源 + 连接池 + 连接):

NAME: Catalina:type=DataSource,host=localhost,context=/,class=javax.sql.DataSource,name="jdbc/evote",connectionpool=connections,connection=1
DESC: Information on the management interface of the MBean
CLAS: org.apache.tomcat.dbcp.dbcp2.PoolableConnection

NAME: Catalina:type=DataSource,host=localhost,context=/,class=javax.sql.DataSource,name="jdbc/evote"
DESC: null
CLAS: org.apache.tomcat.util.modeler.BaseModelMBean

NAME: Catalina:type=DataSource,host=localhost,context=/,class=javax.sql.DataSource,name="jdbc/evote",connectionpool=connections
DESC: Information on the management interface of the MBean
CLAS: org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool

但在其他时候,连接池不会出现在扫描中。我只得到一个简单的数据源:

NAME: Catalina:type=DataSource,host=localhost,context=/,class=javax.sql.DataSource,name="jdbc/evote"
DESC: null
CLAS: org.apache.tomcat.util.modeler.BaseModelMBean

为什么连接池 MBean 不总是可用?

【问题讨论】:

您使用的是哪个(次要)版本的 Tomcat 9.0? tomcat-dbcp.jar 的底层版本在次要修订之间发生了变化。 @PiotrP.Karwasz 在 Eclipse 中运行的是 9.0.30。尚未在独立的 Tomcat 上进行测试。我发现 Eclipse 重新启动 Tomcat 后会出现问题。如果我在创建任何连接之前查询 MBean,则不会返回连接池 bean。我当前的解决方法是在访问 MBean 之前创建一个虚拟连接。 【参考方案1】:

正如您在评论中注意到的,与连接池对应的 MBean 仅在第一次调用 getConnection 后创建。

但是,由于 DBCP 2.8.0 是随 Tomcat 9.0.38 及更高版本一起提供的,因此您在 BasicDataSourceMXBean 上有一个操作 start(),它允许您在不创建任何连接的情况下创建池。

【讨论】:

以上是关于Tomcat 连接池 MBean 并不总是出现在扫描中的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat JDBC连接池(Tomcat 9)

Java做数据库连接池的时候加载oracle的JDBC驱动时总是提示找不到驱动类

tomcat7的数据库连接池tomcatjdbc的25个优势

MBean 描述符

解决Tomcat数据连接池无法释放

JDBC整合c3p0数据库连接池 解决Too many connections错误