【问题标题】:Tomcat JDBC connection amount vs netstat ESTABLISHED connectionsTomcat JDBC 连接数与 netstat ESTABLISHED 连接数
【发布时间】:2019-02-23 07:18:40
【问题描述】:

在我们的一个环境中,tomcat 8 具有以下 JDBC 数据源配置:

<Resource   name="jdbc/mydatasource"
            auth="Container"
            type="javax.sql.DataSource"
            factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
            driverClassName="oracle.jdbc.OracleDriver"
            url="jdbc:oracle:thin:@myhostname:1521:dbname"
            username="username"
            password="password"
            removeAbandoned="false"
            removeAbandonedTimeout="300"
            logAbandoned="true"
            initialSize="5"
            maxActive="100"
            maxIdle="100"
            minIdle="5"
            maxWait="120000"
/>

Netstat 命令返回以下结果:

netstat -anu | grep ${pid}| grep ESTABLISHED | grep ${myhostname}:1521 | wc -l

55

此结果在几天内保持稳定。

同时我通过JMX监控tomcat数据源属性:

numActive = 0

numIdle = 5

这些结果在几天内也保持稳定。

看起来tomcat创建了初始大小为5个连接的JDBC连接池,保持空闲连接数为5,但由于某些原因,netstat显示的已建立连接数是原来的11倍。

当 context.xml 和 JMX 中的 minIdle="5" 显示 numActive+numIdle=5 netstat 也应该显示 5 个已建立的连接,不是吗?

我想在维持 JDBC 池的同时,tomcat 不断打开和关闭与数据库的连接,从 netstat 的角度来看,这些连接一直处于 ESTABLISHED 状态,直到被数据库删除。

我的问题是如何更改tomcat数据源配置,使netstat输出与此配置一致?

非常感谢您。

【问题讨论】:

    标签: tomcat jdbc database-connection connection-pooling netstat


    【解决方案1】:

    这里有一些东西要看:
    1) 您的 netstat 命令只查看 UDP 连接 (-u),这不是您想要的。改为使用:

    netstat -ant | grep -c "${myhostname}:1521.*ESTABLISHED"
    
    # -ant : all, numerical outptut, TCP connections
    # grep -c : returns count of matches
    # no need to grep PID unless you have more than one tomcat instance,
    #  just matching host:1521 is enough.
    

    2) 已建立连接上的本地端口是否发生变化?如果是,则池维护人员会主动打开和关闭连接。
    3) DBCP JMX 配置是否正确?也许你正在监视this,这不是你想要的。

    每 1 秒连续观察一次变化:

    watch -n1 "netstat -ant | grep ':1521.*ESTABLISHED' | nl | tail -n 5"
        11  tcp        0      0 192.168.1.7:50890       172.17.0.23:1521     ESTABLISHED
        12  tcp        0      0 192.168.1.7:58192       172.17.0.23:1521       ESTABLISHED
        13  tcp        0      0 192.168.1.7:54224       172.17.0.23:1521        ESTABLISHED
        14  tcp        0      0 192.168.1.7:34500       172.17.0.23:1521     ESTABLISHED
        15  tcp        0      0 192.168.1.7:54888       172.17.0.23:1521      ESTABLISHED
    

    【讨论】:

    • 非常感谢。使用建议的方法,我找到了建立连接量高的原因:JDBC 数据源是在 tomcat context.xml 文件中定义的,并且是为每个部署的应用程序创建的。在 server.xml GlobalNamingResources 部分定义数据源并在 context.xml / web.xml 中为每个应用程序引用它们解决了问题。
    猜你喜欢
    • 2020-05-15
    • 2011-12-14
    • 2015-03-29
    • 2013-12-21
    • 2017-06-19
    • 2013-05-01
    • 1970-01-01
    • 2012-07-12
    • 2012-03-02
    相关资源
    最近更新 更多