`

ora-01000:超出打开游标的最大数

阅读更多

最近在项目中用到了apache的common-dbcp框架,在spring的配置文件中,加入了dataSource的配置,如下:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
        <!-- Connection Info -->  
        <property name="driverClassName" value="${jdbc.driverClassName}" />  
        <property name="url" value="${jdbc.url}" />  
        <property name="username" value="${jdbc.username}" />  
        <property name="password" value="${jdbc.password}" />  
  
        <!-- Connection Pooling DBCP -->  
        <property name="initialSize" value="5" />  
        <property name="maxActive" value="100" />  
        <property name="maxIdle" value="30" />  
        <property name="maxWait" value="1000" />  
        <property name="poolPreparedStatements" value="true" />  
        <property name="defaultAutoCommit" value="true" />  
    </bean>  

  测试,没问题。但是,在商用环境上,突然发现,经过一段时间的数据库操作,数据库连接的游标用尽,报出maximum open cursors exceeded,   排查了很久,代码里面没有未关连接的情况(因为用的是spring的jdbc模板),也没有使用任何存储过程。在万般无奈下,最后查看了配置文件,突然发现

<property name="poolPreparedStatements" value="true" />  
 

这个配置以前没使用过(注:因为这个配置是从网上down下来的)。查看了common-dbcp的api,原来这个地方把每个connection用到的preparedStatement都缓存到池中了(具体实现机制还没看源代码,我猜想是这样),最后导致preparedStatement未释放,游标也就一直没释放,到游标最大数直接报错。

      最后,把poolPreparedStatements设置为false后,问题解决。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics