2016-09-08 161 views
2

我們的應用程序連接到Oracle數據庫和我們使用Spring提供的JdbcTemplate與數據庫進行交互。根據Spring JDBCTemplate的文檔,它確保它將關閉所有連接和遊標。但顯然我們得到了下面的打開遊標異常。春天JDBC模板 - 最大打開的遊標超出

ORA-01000:最大打開的遊標超出在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84) 〜[彈簧JDBC-4.2.6.RELEASE.jar/org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 〜[spring-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]在 org.spr使用org.springframework.jdbc.core.JdbcTemplate()獲得以下信息:ingframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:645) 〜[spring-jdbc-4.2.6.RELEASE.jar!/:4.2.6.RELEASE] at .query(JdbcTemplate.java:680) 〜[彈簧JDBC-4.2.6.RELEASE.jar /:4.2.6.RELEASE]在 org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java: 7) 〜[spring-jdbc-4.2.6.RELEASE.jar! JDBC-4.2.6.RELEASE.jar /:4.2.6.RELEASE]在 org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:790) 〜[彈簧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版本並未正確關閉遊標。

相關問題