Tomcat JDBC 连接量与 netstat 已建立连接
Tomcat JDBC connection amount vs netstat ESTABLISHED connections
在我们的一个环境中有 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 命令returns 结果如下:
netstat -anu | grep ${pid}| grep ESTABLISHED | grep ${myhostname}:1521 | wc -l
55
这个结果在几天内保持稳定。
同时我通过 JMX 监控 tomcat 数据源属性:
活跃人数 = 0
numIdle = 5
这些结果在几天内也保持稳定。
看起来 tomcat 创建了 JDBC 连接池,初始大小为 5 个连接,将空闲连接数保持在 5,但由于某些原因,netstat 显示的已建立连接数是 11 倍更大。
当 context.xml 中的 minIdle="5" 并且 JMX 显示 numActive+numIdle=5 时,netstat 也应该显示 5 个已建立的连接,不是吗?
我想在维持 JDBC 池的同时 tomcat 不断打开和关闭与数据库的连接,从 netstat 的角度来看,这些连接保持在 ESTABLISHED 状态,直到被数据库删除。
我的问题是如何更改 tomcat 数据源配置以使 netstat 输出与此配置一致?
非常感谢您。
这里有一些东西要看:
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
在我们的一个环境中有 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 命令returns 结果如下:
netstat -anu | grep ${pid}| grep ESTABLISHED | grep ${myhostname}:1521 | wc -l
55
这个结果在几天内保持稳定。
同时我通过 JMX 监控 tomcat 数据源属性:
活跃人数 = 0
numIdle = 5
这些结果在几天内也保持稳定。
看起来 tomcat 创建了 JDBC 连接池,初始大小为 5 个连接,将空闲连接数保持在 5,但由于某些原因,netstat 显示的已建立连接数是 11 倍更大。
当 context.xml 中的 minIdle="5" 并且 JMX 显示 numActive+numIdle=5 时,netstat 也应该显示 5 个已建立的连接,不是吗?
我想在维持 JDBC 池的同时 tomcat 不断打开和关闭与数据库的连接,从 netstat 的角度来看,这些连接保持在 ESTABLISHED 状态,直到被数据库删除。
我的问题是如何更改 tomcat 数据源配置以使 netstat 输出与此配置一致?
非常感谢您。
这里有一些东西要看:
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