From 32c8951a93d8811be89fb9dfb8954ad71a75ffcb Mon Sep 17 00:00:00 2001 From: "Greg L. Turnquist" Date: Thu, 4 May 2023 16:13:45 -0500 Subject: [PATCH] Close `StoredProcedureQuery` if it implements AutoCloseable. If the JPA provider's implementation of StoredProcedureQuery implements AutoCloseable, invoke the close method when completed. Resolves #2915. Original pull request: #2938 --- .../repository/query/JpaQueryExecution.java | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryExecution.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryExecution.java index 90ddbaa67..428fba44b 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryExecution.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryExecution.java @@ -332,24 +332,36 @@ public abstract class JpaQueryExecution { Assert.isInstanceOf(StoredProcedureJpaQuery.class, jpaQuery); StoredProcedureJpaQuery storedProcedureJpaQuery = (StoredProcedureJpaQuery) jpaQuery; + StoredProcedureQuery storedProcedure = storedProcedureJpaQuery.createQuery(accessor); - boolean returnsResultSet = storedProcedure.execute(); + try { - if (returnsResultSet) { + boolean returnsResultSet = storedProcedure.execute(); - if (!SurroundingTransactionDetectorMethodInterceptor.INSTANCE.isSurroundingTransactionActive()) { - throw new InvalidDataAccessApiUsageException(NO_SURROUNDING_TRANSACTION); + if (returnsResultSet) { + + if (!SurroundingTransactionDetectorMethodInterceptor.INSTANCE.isSurroundingTransactionActive()) { + throw new InvalidDataAccessApiUsageException(NO_SURROUNDING_TRANSACTION); + } + + if (storedProcedureJpaQuery.getQueryMethod().isCollectionQuery()) { + return storedProcedure.getResultList(); + } else { + return storedProcedure.getSingleResult(); + } } - if (storedProcedureJpaQuery.getQueryMethod().isCollectionQuery()) { - return storedProcedure.getResultList(); - } else { - return storedProcedure.getSingleResult(); + return storedProcedureJpaQuery.extractOutputValue(storedProcedure); + + } finally { + + if (storedProcedure instanceof AutoCloseable autoCloseable) { + try { + autoCloseable.close(); + } catch (Exception ignored) {} } } - - return storedProcedureJpaQuery.extractOutputValue(storedProcedure); } }