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

来源:百度文库 编辑:神马文学网 时间:2024/04/29 19:43:14

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

Xml代码
  1.  id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  2.           
  3.          name="driverClassName" value="${jdbc.driverClassName}" />  
  4.          name="url" value="${jdbc.url}" />  
  5.          name="username" value="${jdbc.username}" />  
  6.          name="password" value="${jdbc.password}" />  
  7.   
  8.           
  9.          name="initialSize" value="5" />  
  10.          name="maxActive" value="100" />  
  11.          name="maxIdle" value="30" />  
  12.          name="maxWait" value="1000" />  
  13.          name="poolPreparedStatements" value="true" />  
  14.          name="defaultAutoCommit" value="true" />  
  15.       

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

Xml代码
  1.  name="poolPreparedStatements" value="true" />  

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

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