0%

JPA @Procedure는 @Transactional에 싸서 사용하세요

옛 버전의 슬픔

JPA 2.6.x 버전 이상부터는 @Procedure를 사용하여 프로시저를 호출 할 때 @Transactional을 사용하지 않으면 에러가 발생합니다.
You're trying to execute a @Procedure method without a surrounding transaction that keeps the connection open so that the ResultSet can actually be consumed. Make sure the consumer code uses @Transactional or any other way of declaring a (read-only) transaction.

하지만 그 말은 즉 이전 버전의 JPA에서는 @Transactional을 사용하지 않아도 에러 없이 프로시저를 호출 할 수 있고 예기치 않은 문제가 발생할 수 있습니다.


저는 db 커넥션이 닫히지 않아 커넥션 풀이 고갈되는 문제가 발생해서 상당히 고생했었습니다. (검색도 잘 안됨…)

재현을 하려고 해도 특수한 상황이었는지 재현이 되지 않습니다. 대신 동일 현상을 겪었던 10년도 더 된 스택오버플로우 질문을 발견했습다. @Procedure annotation orphaning database connections (spring-data-jpa)

느낀 점

다른 서버에서 자주 사용하지 않는 api 호출이 있을 때 발생, 커넥션이 모니터링 되고 있지 않았고, 커넥션 풀 고갈 문제는 커넥션이 없어져야 발생하므로 테스트 서버에서도 그 정도까지 호출이 되지 않아서 미리 발견하지 못했었습니다.

그래서 원인 파악조차 너무 느렸습니다. 여러 가지 시도를 하던 중에 커넥션이 계속 열려있는 것을 발견하고, hikariCP옵션을 켜보니 leak이 발생하는 것을 확인했습니다.

로깅과 모니터링의 중요성을 다시 한번 뼈저리게 느꼈습니다.