我一直在尝试将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>
Run Code Online (Sandbox Code Playgroud)
在没有关闭连接错误的情况下运行它需要一些时间,但现在我遇到了内存管理问题.我已经针对我使用ThreadPool的应用程序运行jconsole.此应用程序使用线程池并使用ThreadPoolExecutors根据从文件传递的数据创建费用请求.一个文件可以有数十万个费用请求.我的问题是Heap中的长期记忆正在填满并且不会释放对象.在我设置的性能测试中,垃圾收集中的长期记忆大约在20-25分钟内完成,并且永远不会释放.该应用程序最终达到了GC Limit Exceeded Exception并停止运行.
当我使用旧的OracleConnectionCacheImpl类运行相同的测试时,它只运行没有问题.假设线程池和所有附带的代码都是使用旧版本的Spring(1.2.6)和旧的ojdbc驱动程序编写的,但OracleConnectionCacheImpl与Universal Connection Pooling的工作方式有什么不同?如果我想要容纳最新版本的Oracle JDBC驱动程序代码,我是否正在考虑重写我的域模型?我尝试过OracleDataSource连接,并且在同时处理多个文件后,它与NullPointerExceptions失败了.然后我去了UCP(在这个论坛的另一个帖子的建议),除了一个应用程序之外的所有工作都很好.此时我正在试图弄清楚是否可以为我的数据源进一步优化Spring配置bean,还是我需要开始考虑升级代码库.如前所述,此代码与旧的ojdbc类运行良好,但我在尝试实现UCP的每一步都遇到了问题.我开始怀疑它是否值得升级.