【问题标题】:JavaMelody JDBC Graph not working Tomcat 8.8 and mysql DBJavaMelody JDBC Graph 不工作 Tomcat 8.8 和 mysql DB
【发布时间】:2020-12-29 10:29:02
【问题描述】:

我在 Tomcat 8.8 上配置了 javamelody 1.86.0,除 JDBC 外,所有其他指标均已捕获。以下是我在 Tomcat 应用程序上的配置:

Context.xml:

<ResourceLink type="javax.sql.DataSource"
              name="jdbc/LocalAPIDB"
              global="jdbc/APIDB"/>

Server.xml:

<Resource type="javax.sql.DataSource"
          name="jdbc/APIDB"
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
          driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/apiDB"
          username="xxxx"
          password="xxxxx"
          initialSize="340"
          maxActive="3770"
          maxIdle="2330"
          minIdle="890"
          testOnBorrow="true"
          validationQuery="SELECT 1"
          validationInterval="30000"
          timeBetweenEvictionRunsMillis="5000"
          minEvictableIdleTimeMillis="60000"
          removeAbandoned="true"
          removeAbandonedTimeout="60"
          abandonWhenPercentageFull="0"
          logAbandoned="true"
          jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer"/>

在 mbeans 上我可以看到有活动的连接,但在图表上没有捕获任何内容。

JDBC 图

MBean

调试日志

【问题讨论】:

  • 请附上监控页面底部显示的“调试日志”。
  • @evernat 调试日志添加为图像的一部分。谢谢

标签: java-melody


【解决方案1】:

我建议您将 Resource 从 server.xml 移动到 webapp (conf/Catalina/localhost/MpesaIntegrations.xml) 的 xml 上下文文件并删除 ResourceLink。

所以webapp的xml上下文文件是这样的:

    <?xml version="1.0" encoding="UTF-8" ?>
    <Context>
        <Resource type="javax.sql.DataSource"
        name="jdbc/LocalAPIDB"
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/apiDB"
        username="xxxx"
        password="xxxxx"
        initialSize="340"
        maxActive="3770"
        maxIdle="2330"
        minIdle="890"
        testOnBorrow="true"
        validationQuery="SELECT 1"
        validationInterval="30000"
        timeBetweenEvictionRunsMillis="5000"
        minEvictableIdleTimeMillis="60000"
        removeAbandoned="true"
        removeAbandonedTimeout="60"
        abandonWhenPercentageFull="0"
        logAbandoned="true"
        jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer"
        />
    </Context>

而且/或者,如果这还不够,您的 web 应用程序中可能有一个侦听器或过滤器,它正在获取数据源并将其保存在缓存中。在这种情况下,请将 javamelody 侦听器和过滤器放在 WEB-INF/web.xml 文件的顶部附近。

【讨论】:

    【解决方案2】:

    对于任何想弄清楚为什么 JavaMelody 不会显示诸如“活动 JDBC 连接”之类的数据库统计信息的人来说,我最终通过做两件事解决了这个问题。请注意,在我的例子中,我使用的是运行 Apache Tomcat 9 的 Java 11,托管 Apache Derby 10.15.2 数据库:

    1. 在 'apache-tomcat-9.0.52\conf\context.xml' 文件中设置数据库,而不是在我的 webapp 中的 java 代码中。我认为这使数据库与 JNDI 资源名称相关联,因此 JavaMelody 可以看到它。我将此 XML 添加到该 context.xml 文件中:
    <Resource name="jdbc/DatabaseJNDIResourceName"
        auth="Container" 
        type="javax.sql.DataSource" 
        driverClassName="org.apache.derby.jdbc.EmbeddedDriver" 
        url="jdbc:derby:../DatabaseName;" 
        username="someuser" 
        password="s3cret" 
        />
    

    然后您可以使用以下方法在您的 webapp java 代码中获取 DataSource:

    InitialContext initialContextJNDI = new InitialContext();
    DataSource dataSource = (DataSource)initialContextJNDI.lookup("java:comp/env/jdbc/DatabaseJNDIResourceName");
    

    请注意,检测潜在 JNDI 资源名称问题的一种方法是通过导航到底部的“JNDI 树”页面来查看资源名称是否显示在 JavaMelody 中,此处链接 http://localhost:8080/monitoring?part=jndi

    1. 插入web.xml code referred to here。有趣的是,当省略该 XML 代码时,javamelody 仍会运行,但它不会报告与 JDBC 相关的数据。
    <filter>
        <filter-name>javamelody</filter-name>
        <filter-class>net.bull.javamelody.MonitoringFilter</filter-class>
        <async-supported>true</async-supported>
    </filter>
    <filter-mapping>
        <filter-name>javamelody</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>ASYNC</dispatcher>
    </filter-mapping>
    <listener>
        <listener-class>net.bull.javamelody.SessionListener</listener-class>
    </listener>
    

    另外一件事,即使在这些修复最终解决了问题并使 JavaMelody 了解我的数据库之后,我也没有立即注意到,因为如果您的数据库查询速度很快,图表几乎不会发生变化。我只确认在执行长 SQL 查询并更新“打开的 jdbc 连接”页面后记录了数据库统计信息,该页面链接在此处的 javamelody 统计信息页面的底部,该页面显示了一个连接,而数据库需要几秒钟才能完成处理大型(100 万行表)查询http://localhost:8080/monitoring?part=connections

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-06
      • 2014-10-15
      • 1970-01-01
      • 2012-06-15
      • 2014-09-14
      • 2012-06-21
      • 2013-07-13
      • 1970-01-01
      相关资源
      最近更新 更多