日常开发异常问题解决

来源:互联网 发布:安卓写轮眼优化教程 编辑:程序博客网 时间:2024/05/19 23:15

ONE: ORA-01000: maximum open cursors exceeded 

  空中测试策略数据库操作功能,每秒发送25条,每条执行至少6次查询和更改操作,使用ibatis框架作为数据底层,几乎10秒钟就会报
   “ORA-01000: maximum open cursors exceeded”异常。
   后来经查询是因为PreparedStatement打开太多导致,但详细原因无法找到,只好baidu了。
  
   将其ibatis改成jdbc,按照网上的一些解决方案
   1. 强制关闭PreparedStatement,每执行一次查询就关闭一次,新的查询重新打开。
   2. 手动connection.commit(),也有人说,可能是数据库版本太低,导致无法自动提交所致。
   3. 也有人说,是因为循环里面多次打开PreparedStatement,我的代码内没有循环,这个原因排除。
 
   以上方法都没有解决我的问题,无意间查看了dataSource的配置,将poolPreparedStatements改为false解决(无论ibatis和jdbc都好使了)。
   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:@172.16.4.44:1521:KONG"/>
        <property name="username" value="sms1"/>
        <property name="password" value="4sgsdgre"/>
        <property name="maxActive" value="50"/>
        <property name="maxWait" value="20"/>
        <property name="poolPreparedStatements" value="false"/>
        <property name="defaultAutoCommit" value="true"/>
    </bean>
  
  poolPreparedStatements
  protected boolean poolPreparedStatementsPrepared statement pooling for this pool.
  When this property is set to true both PreparedStatements and CallableStatements are pooled.

  看来,这个poolPreparedStatements导致打开了了无数PreparedStatements,切记切记。

 参考资料:DBCP配置