Oracle UCP在Java 1.7 + TC Server上的高CPU使用率

时间:2013-09-16 12:12:31

标签: oracle tomcat datasource ucp tcserver

前段时间我们已经将我们的一个Web应用程序从Resin和Java 6迁移到VMware vFabric tc Server和Java 7.这还包括将所有JNDI数据源从Resin实现移动到Oracle UCP。当我在本地运行应用程序时,我注意到我的CPU使用率非常高。将VisualVM附加到tc后,我发现正在使用我的CPU的是Oracle UCP:

enter image description here

我的本​​地配置是:Windows 7x64,Java 1.7.0_25x32(JDK)和vFabric tc Server标准2.7.0.RELEASE。以下是我在context.xml中配置数据源的方法:

  

  <WatchedResource>WEB-INF/web.xml</WatchedResource>

  <Resource name="jdbc/oracle"
            auth="Container"
            factory="oracle.ucp.jdbc.PoolDataSourceImpl"
            type="oracle.ucp.jdbc.PoolDataSourceImpl"
            connectionFactoryClassName="oracle.jdbc.pool.OracleDataSource"
            url="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=h1.com)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=h2.com)(PORT=1521))(LOAD_BALANCE=yes)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=SERVICENAME)))"
            user="user"
            password="password"
            minPoolSize="0"
            initialPoolSize="1"
            maxPoolSize="50"
            ONSConfiguration="nodes=h1:6200,h2:6200"
            connectionWaitTimeout="60"
            inactiveConnectionTimeout="900"
            abandonedConnectionTimeout="900"
            fastConnectionFailoverEnabled="false"
            validateConnectionOnBorrow="true"
            connectionPoolName="NAME"/>

有趣的是,在产品盒上一切正常。我不知道确切的配置,但我们安装了Fedora或CentOS和Hotspot 7。

我已经尝试过标准的Tomcat数据源实现,但在我的情况下效果不好:我的本地机器和数据库集群之间的连接非常不稳定,因此对我来说自动恢复和负载平衡至关重要。此外,我希望我的本地配置与prod类似,因此使用另一个池是不可取的。

也许有人遇到同样的问题而且知道解决方案?也许错过了一些JVM arg或本地库?

1 个答案:

答案 0 :(得分:1)

请考虑减少以下参数的超时秒数,因为它可能是影响因素之一

1)inactiveConnectionTimeout

2)abandonedConnectionTimeout

花费在空闲连接上的更多时间(借用和可用)将需要更多内存来保存连接。

使用Web应用程序时,由于内存使用率过高,这可能间接导致使用更多的CPU。

请查看以下链接以获取更多信息

Optimizing Universal Connection Pool Behavior

CPU usage VS RAM