我一直在尝试将ojdbc14-10.2.0.1.0中的ojdbc代码升级到ojdbc6-11.1.0.7.0。我们一直使用OracleConnectionCacheImpl进行数据源连接,然后使用OracleDataSource移动到Universal Connection Pool。下面是我们目前已经在春天配置:通用连接池内存管理
<bean id="myDatasource" class="oracle.ucp.jdbc.PoolDataSourceFactory" factory-method="getPoolDataSource">
<property name="URL" value="@[email protected]"/>
<property name="user" value="@[email protected]"/>
<property name="password" value="@[email protected]"/>
<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的工作方式与Universal Connection Pooling的方式有什么不同吗?如果我想要适应最新版本的Oracle JDBC驱动程序代码,我是否正在考虑重写我的域模型?我已经尝试过OracleDataSource连接,并且在同时处理多个文件之后,使用NullPointerExceptions失败了。然后,我去了UCP(在这个论坛上的另一篇文章的建议),除了一个应用程序,其他人都可以正常工作。在这一点上,我试图弄清楚是否可以进一步优化我的数据源的Spring配置bean,还是需要开始考虑升级代码库。如前所述,这段代码对旧的ojdbc类运行得非常好,但是我尝试实现UCP的每一步都遇到了问题。我开始怀疑它是否值得升级。