前段时间,我们将我们的一个 Web 应用程序从 Resin 和 Java 6 迁移到了 VMware vFabric tc Server 和 Java 7。这还包括将所有 JNDI 数据源从 Resin 实现迁移到 Oracle UCP。当我在本地运行应用程序时,我注意到我的 CPU 使用率非常高。将 VisualVM 附加到 tc 后,我发现消耗我的 CPU 的是 Oracle UCP:
我的本地配置是: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"/>
有趣的是,在产品盒上一切正常。我不知道确切的配置,但我们在它们和 Hotspot 7 上安装了 Fedora 或 CentOS。
我已经尝试过标准的 Tomcat 数据源实现,但在我的情况下效果不佳:我的本地计算机和数据库集群之间的连接非常不稳定,因此自动恢复和负载平衡对我来说至关重要。另外,我希望我的本地配置类似于 prod,因此不希望使用另一个池。
也许有人面临同样的问题并知道解决方案?也许错过了一些 JVM arg 或本机库?