gpt4 book ai didi

java - 带有 Oracle 数组 : ORA-01000: maximum open cursors exceeded 的 Spring StoredProcedure

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:56:43 25 4
gpt4 key购买 nike

多次使用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);
}
}

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

基本上,堆包含许多未关闭的 Statement 对象。知道为什么 spring 不关闭资源吗?

环境:- Java 1.8、Spring 4.1.6、Tomcat 7。

最佳答案

检查您的 open_cursor 参数。此参数定义每个 session 允许的最大游标。默认为 50。

检查是否有任何游标泄漏。通常 200 ~ 300 的值对于普通用户来说应该绰绰有余。

关于java - 带有 Oracle 数组 : ORA-01000: maximum open cursors exceeded 的 Spring StoredProcedure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34716456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com