前段时间公司的产品总一天内总是出现Oracle达到最大连接数的问题,公司的产品是由3-4个独立的应用组成,所以具体是哪个应用引发的问题花费了一段时间诊断,具体如下。
一、先介绍一下运行环境
- HP-NUIX操作系统
- 几个应用分别独立运行,采用将java.exe重命名的方式以区分不同进程。
- 几个应用可能都使用连接池连接Oracle数据库,其中一个是使用的Apache-DBCP,一个由于使用了Hibernate使用了C3P0连接池(由我负责的那个应用),另外1-2两个应用不能确定是通过什么方式连接的Oracle数据库。
环境大致如上所述。
二、诊断定位过程
刚开始最直接的就是使用 netstat 命令查看端口连接,想查看到底是哪个进程的连接数过大没有控制住,但是发现查看结果不能定位到PID。于是Google HP-UNIX定位PID的命令,Google的最终结果见我总结的 HP-UNIX 查看端口号和进程的对应关系 一文。但是等找到LSOF命令后连接数又正常了~~~。
后来就想能不能从Oracle上查到一些历史记录反定位进程,先后查到了v$session、v$process视图等其中v$process视图中有PID字段,试的查了一下好像并不是我想要的。但是发现在v$session视图中有一个program字段查看了其中的值有“plsqldev.exe”等,发现通过JDBC连接的program的值全是“JDBC Thin Client”,由此我就想在JDBC连接的时候是不是能指定我的JDBC的连接在Oracle的v$session视图中的值。
在Google中敲入"Oracle JDBC v$session program"第一条就定位到了一片文章(参见 ),根据文章所述C3P0的配置如下:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="jdbcUrl" value="${jdbcUrl}"/> <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/> <property name="properties"> <map> <entry key="user" value="${user}"/> <entry key="password" value="${password}"/> <entry key="v$session.program" value="${program}"/> </map> </property> </bean>
到目前为止已经可以通过两种途径定位连接数问题了,借助以上内容最终定位了公司的问题~。
文章参考链接如下: