Я использую веб-сервис SpringBoot 2.0, используя Java 8. Мне пришлось использовать PreparedStatement для обработки сгустков, поэтому вместо того, чтобы позволить Spring создать соединение Oracle, мне пришлось создать свое собственное. Однако теперь у меня, кажется, есть утечка соединения, хотя я закрываю соединение после того, как я закончу, и после того, как я запустил свой webService 3 раза (я пропускаю 3 соединения каждый раз), я получаю ошибку:
org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30002ms.
DEBUG - HikariPool-1 - Pool stats (total=10, active=9, idle=1, waiting=0)
Поэтому я добавил следующее в application.properties, чтобы найти утечку:
spring.datasource.hikari.leakDetectionThreshold=2000
, а затем я получил следующую ошибку при первом запуске моего веб-сервиса:
java.lang.Exception: Apparent connection leak detected
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128)
at com.clarivate.singularity.chemworkbench.dcrws.database.ReadFromDb.readStructureSearch(ReadFromDb.java:187)
Ниже приведен метод выдачи ошибки:
public class myClass(){
@Autowired
NamedParameterJdbcTemplate jdbcTemplate;
@Transactional
public List<DcrData> readStructureSearch(String sqlStr, String fileData) throws SQLException {
List<DcrData> dcrDataList = null;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = this.jdbcTemplate.getJdbcTemplate().getDataSource().getConnection().unwrap(OracleConnection.class); // <<<< This is line 187 mentioned above which is giving the error
Clob myClob = conn.createClob();
int ret = myClob.setString( 1, fileData);
ps = conn.prepareStatement(sqlStr);
ps.setClob(1,myClob); // This works, Types.CLOB doesn't work.
rs = ps.executeQuery();
ResultSetHandler<List<DcrData>> handler =
new BeanListHandler<DcrData>(DcrData.class, new BasicRowProcessor(new GenerousBeanProcessor()));
dcrDataList = handler.handle(rs);
return dcrDataList;
}finally {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
logger.info("DSxxx4");
}
}
Как создать соединение без утечек и почему Hikari считает, что мой метод conn.close () не закрывает соединение? Любые идеи приветствуются.