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 并不总是出现在扫描中的主要内容,如果未能解决你的问题,请参考以下文章
Java做数据库连接池的时候加载oracle的JDBC驱动时总是提示找不到驱动类