2011-10-10 34 views
1

我一直在尝试将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的每一步都遇到了问题。我开始怀疑它是否值得升级。

回答

6

这个问题曾窃听过我几个月了,我希望我想出了帮助别人那里:

我终于想出一个解决我的问题。除了使用OracleDataSource作为连接工厂:

<property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleDataSource"/> 

我会建议尝试OracleConnectionPoolDataSource:

<property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleConnectionPoolDataSource"/> 

OracleConnectionPoolDataSource延伸OracleDataSource,似乎在多个连接需要由多个资源被打开的应用程序做的更好。就我而言,我有一个需要处理多个批处理文件的应用程序。相同的SQL代码会反复运行,但应用程序需要每个新文件的新连接。在这种情况下,OracleDataSource经常出现连接错误或某种错误(例如,SQLException:关闭连接,NullPointerException:连接关闭,有或没有UCP),导致垃圾收集问题(长期GC会填满并导致GC最终失败不管我添加到JVM的内存有多少)。

我发现OracleDataSource在不使用大量批处理的应用程序上运行良好。例如,我使用的另一个应用程序是文件处理应用程序,但它一次只能处理一个文件。 OracleDataSource在这种情况下工作良好。它也似乎适用于Web应用程序。我们有一个Web应用程序,我们在9个月前安装了OracleDataSource,并且没有任何问题。

我确定有办法让OracleDataSource和OracleConnectionPoolDataSource一样工作,但这对我很有用。