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配置