我一直在尝试将我的 ojdbc 代码从 ojdbc14-10.2.0.1.0 升级到 ojdbc6-11.1.0.7.0。我们一直在使用 OracleConnectionCacheImpl 进行数据源连接,然后使用 OracleDataSource 作为核心移动到通用连接池。这是我们目前在 Spring 中配置它的方式:
<bean id="myDatasource" class="oracle.ucp.jdbc.PoolDataSourceFactory" factory-method="getPoolDataSource">
<property name="URL" value="@JDBC_URL@"/>
<property name="user" value="@JDBC_USERNAME@"/>
<property name="password" value="@JDBC_PASSWORD@"/>
<property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleDataSource"/>
<property name="connectionPoolName" value="MFR_RTE_POOL"/>
<property name="minPoolSize" value="5"/>
<property name="maxPoolSize" value="100"/>
<property name="validateConnectionOnBorrow" value="true" />
<property name="connectionWaitTimeout" value="30"/>
<property name="connectionHarvestMaxCount" value="25"/>
<property name="connectionHarvestTriggerCount" value="5"/>
<property name="maxStatements" value="100"/>
</bean>
在没有关闭连接错误的情况下运行它需要一些时间,但现在我遇到了内存管理问题。我已经针对使用 ThreadPool 的应用程序运行 jconsole。此应用程序使用线程池并使用 ThreadPoolExecutors 根据从文件传递的数据创建费用请求。一个文件可以有数十万个费用请求。我的问题是堆中的长期内存正在填满并且没有释放对象。在我设置的性能测试中,垃圾收集中的长期内存在大约 20-25 分钟内被填满,并且永远不会释放。应用程序最终遇到 GC 限制超出异常并停止运行。
当我使用旧的 OracleConnectionCacheImpl 类运行相同的测试时,它运行起来没有问题。假设线程池和所有附带的代码都是使用旧版本的 Spring (1.2.6) 和旧的 ojdbc 驱动程序编写的,但是 OracleConnectionCacheImpl 的工作方式与通用连接池的工作方式真的有那么大的区别吗?如果我想适应 Oracle 的 JDBC 驱动程序代码的最新版本,我是否正在考虑重写我的域模型。我已经尝试过 OracleDataSource 连接,但在同时处理多个文件后,它因 NullPointerExceptions 而失败。然后我去了UCP(根据本论坛另一篇帖子的建议),它在除一个应用程序之外的所有应用程序中都可以正常工作。此时我' 我试图弄清楚我是否可以为我的数据源进一步优化 Spring 配置 bean,或者我是否需要开始考虑升级代码库。如前所述,这段代码在旧的 ojdbc 类上运行得非常好,但我在尝试实现 UCP 的每一步都遇到了问题。我开始怀疑它是否值得升级。