加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用Oracle数组的Spring StoredProcedure:ORA-01000:超出了最

发布时间:2020-12-12 13:08:36 所属栏目:百科 来源:网络整理
导读:使用OracleTypes.ARRAY输入参数多次调用Oracle存储过程时,收到以下错误: – org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; uncategorized SQLException for SQL [{call EMP_SCHEMA.GET_EMPLOYEE_LIST(?,?)}]; SQL state
使用OracleTypes.ARRAY输入参数多次调用Oracle存储过程时,收到以下错误: –
org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; uncategorized SQLException for SQL [{call EMP_SCHEMA.GET_EMPLOYEE_LIST(?,?)}]; SQL state [72000]; error code [1000]; ORA-01000: maximum open cursors exceeded; nested exception is java.sql.SQLException: ORA-01000: maximum open cursors exceeded
            at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84) ~[spring-jdbc-4.1.6.RELEASE.jar:4.1.6.RELEASE]
            at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-4.1.6.RELEASE.jar:4.1.6.RELEASE]

JDBC模板配置是: –

<bean id="commonsDbcpNativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor" />
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <constructor-arg>
        <ref bean="dataSource" />
    </constructor-arg>
    <property name="nativeJdbcExtractor" ref="commonsDbcpNativeJdbcExtractor" />
</bean>

存储过程类: –

public class GetEmployees extends StoredProcedure {
  public GetEmployees(JdbcTemplate jdbcTemplate) {
    super(jdbcTemplate,"EMP_SCHEMA.GET_EMPLOYEE_LIST");
    declareParameter(new SqlParameter("p_emp_id_list",OracleTypes.ARRAY,"TBL_EMP_ID"));
    declareParameter(new SqlOutParameter(CURSOR,OracleTypes.CURSOR,new EmployeeDataRowMapper()));
    compile();
  }

  public List<Employee> ofIds(Set<EmployeeId> employeeIds) {
    Map<String,OracleArraySqlTypeValue> params = new HashMap<>();
    params.put("p_emp_id_list",new OracleArraySqlTypeValue(employeeIds));
    final Map<String,Object> result = execute(params);

    return (List<Employee>) result.get(CURSOR);
  }
}

Oracle SqlTypeValue: –

public class OracleArraySqlTypeValue extends AbstractSqlTypeValue {
  private final String[][] employeeIds;

  public OracleArraySqlTypeValue(String[][] employeeIds) {
    this.employeeIds = employeeIds;
  }

  @Override
  protected Object createTypeValue(Connection connection,int sqlType,String typeName) throws SQLException {
    ArrayDescriptor arrayDescriptor = new ArrayDescriptor(typeName,connection);
    return new ARRAY(arrayDescriptor,connection,employeeIds);
  }
}

而不是CommonsDbcpNativeJdbcExtractor也尝试使用OracleJdbc4NativeJdbcExtractor.但仍然存在错误.

基本上堆包含许多未闭合的Statement对象.知道为什么春天没有关闭资源?

环境: – Java 1.8,Spring 4.1.6,Tomcat 7.

检查你的open_cursor参数.此参数定义允许的最大游标PER SESSION.默认值为50.

检查是否有任何光标泄漏.通常情况下,200到300的值应该足以满足普通用户的需求.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读