2016-09-08 2 views
2

우리의 응용 프로그램은 Oracle 데이터베이스에 연결하고 우리는 Spring에서 제공하는 JDBCTemplate을 사용하여 데이터베이스와 상호 작용합니다. Spring JDBCTemplate의 문서에 따라 모든 연결과 커서를 닫을 것을 보장한다. 하지만 분명히 다음과 같은 열린 커서 예외가 발생합니다.Spring JDBC 템플릿 - 최대 열린 커서를 초과했습니다

ORA-01000 :! 최대 열린 커서가 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate (AbstractFallbackSQLExceptionTranslator.java:84) ~ [스프링 JDBC - 4.2.6.RELEASE.jar에서 초과/: 4.2.6.RELEASE] org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate (AbstractFallbackSQLExceptionTranslator.java:81)에서 ~ [스프링 JDBC-4.2.6.RELEASE.jar /! 4.2.6.RELEASE] at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate (AbstractFallbackSQLExceptionTranslator.java:81) org.spr에서 ~ [spring-jdbc-4.2.6.RELEASE.jar!/: 4.2.6.RELEASE] ingframework.jdbc.core.JdbcTemplate.execute (JdbcTemplate.java:645) ~ [spring-jdbc-4.2.6.RELEASE.jar!/: 4.2.6.RELEASE] at org.springframework.jdbc.core.JdbcTemplate .query (JdbcTemplate.java:680) 에있는 [spring-jdbc-4.2.6.RELEASE.jar!/: 4.2.6.RELEASE] org.springframework.jdbc.core.JdbcTemplate.query (JdbcTemplate.java : 712) ~ [spring-jdbc-4.2.6.RELEASE.jar!/: 4.2.6.RELEASE] at org.springframework.jdbc.core.JdbcTemplate.query (JdbcTemplate.java:722) ~ [spring- jdbc-4.2.6.RELEASE.jar!/: 4.2.6.RELEASE] at org.springframework.jdbc.core.JdbcTemplate.queryForObject (JdbcTemplate.java:790) ~ [spring-jdbc-4.2.6.RELEASE .jar!/: 4.2.6.RELEASE] at org.springframework.jdbc.core.JdbcTemplate.queryForObjec t (JdbcTemplate.java:809) 가 ~ [스프링 JDBC - 4.2.6.RELEASE.jar/:! 4.2.6.RELEASE]

코드 조각 :

private Optional<PartyAccess> executeQuery(Object... args) { 
    try { 
     String query = "SELECT EMP.ID as PARTY_ID, EMP.MPIN_HSB, EMP.INVALID_MPIN_HSB_COUNT, " + 
       "EMP.MPIN_HSB_MODIFIED_ON, EMP.MPIN_LSB, EMP.INVALID_MPIN_LSB_COUNT, EMP.MPIN_LSB_MODIFIED_ON, " + 
       "EMP.EMP_PIN AS SMS_PIN, EMP.NUMBER_OF_PIN_CODE_FAILURE AS INVALID_SMS_PIN_COUNT, EMP.PIN_MODIFIED_ON, " + 
       "EMP.PINFLAG AS USE_SHA2_HASH_FOR_PIN, CASE WHEN EMP_BLACKLIST_STATUS = 'Y' THEN 1 ELSE 0 END AS BLOCKED " + 
       "FROM MTX_EMPLOYEE EMP WHERE EMP.ID = ?"; 
     return Optional.of((PartyAccess) jdbcTemplate.queryForObject(query, 
       args, 
       new BeanPropertyRowMapper(PartyAccess.class))); 
    } catch (DataAccessException ex) { 
     LOGGER.error("Error occurred", ex); 
     return Optional.empty(); 
    } 
} 

우리는 히카리를 사용 JDBC 연결 풀의 경우 최대 크기는 10입니다. 응용 프로그램에 많은 요청이있을 때 문제가 발생합니다. 데이터베이스의 max_cursors를 늘려 보았습니다 (나쁜 해결책 인 것 같습니다). 그러나 심지어 그것은 도움이되지 않았습니다. 들어오는 요청이 많을 때 열려있는 커서를 모니터했습니다. 값은 설정된 최대 커서 값을 초과하지 않았습니다.

답변

0

JPA 버전을 최신 버전으로 업그레이드 한 후 문제가 해결되었습니다. 이전 봄 jpa 버전은 커서를 제대로 닫지 않았습니다.

관련 문제