Quando si chiama una stored procedure Oracle con parametri OracleTypes.ARRAY
ingresso più volte, ottenendo il seguente errore: -primavera StoredProcedure con Oracle matrice: ORA-01000: massimo cursori aperti superato
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]
La configurazione del modello 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>
La classe di stored procedure: -
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);
}
}
Invece di CommonsDbcpNativeJdbcExtractor
provato con OracleJdbc4NativeJdbcExtractor
troppo. Ma ancora l'errore è lì.
Fondamentalmente lo heap contiene molti oggetti non chiusi Statement
. Qualche idea sul perché la primavera non stia chiudendo le risorse?
Ambiente: - Java 1.8, Primavera 4.1.6, Tomcat 7.
@LalitKumarB Mentre la domanda collegata risponde a quale causa sottostante l'errore 'ORA-01000', esso non risponde alla domanda che l'OP ha chiesto quale era" Perché la molla non chiude le risorse? " – MT0
@LalitKumarB Si prega di non contrassegnare le domande come duplicate, senza leggerle – Manu
Dopo la riapertura. Una nota a margine, sarebbe bello se tu potessi modificare la domanda e spiegare perché non è un duplicato. –