我們的應用程序連接到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(我知道這個解決方案不好)。但即使如此,這也沒有幫助。當有很多請求進入時,我們監視打開的遊標,該值不超過正在設置的最大遊標值。