2023. 1. 6. 19:31ㆍETC
우리가 만든 앱에서 DB와 connection을 맺어서 CRUD를 이용하는데요.
여기서 DB와 connection을 맺는 행위 자체가
Cost가 되게 큰 행위입니다.
DB를 사용할 때마다 connection을 맺고 다 쓰면 끊고,
이 행위를 반복한다면 App의 퍼포먼스도 현저히 떨어지게 되겠죠?
그렇기에 Connection pool이라는 방법을 이용하여
connection을 관리하게 됩니다.
위 사진 처럼 Pool에서 connection을 가져와서 사용한 후에 다시 반납하고
이런 행위를 반복하면서 connection을 맺고 끊는
불필요한 행위를 안 할 수 있게 해줍니다.
하지만 connection을 사용하려고 하는데
사용 가능한 connection이 없다면
APP을 polling시키며 지정한 Time-out이 지나면
Error를 뱉게 됩니다.
connection pool을 사용하다 오류가 나서 해당 상황을 공유하려 합니다.
Failed to obtaion JDBC Connection; nested exception is java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
라는 오류가 발생했습니다.
해당 오류를 검색해보니까 DeadLock이라는 단어가 유난히 많이 보이더라구요.
하여, Thread가 서로를 무한정 대기하는 상황으로 인해 timeout이 발생한 줄 알았습니다.
하지만 다른 분께 여쭤보니 DeadLock은 아니라고 하셨습니다.
단순하게 Timeout을 늘리는 방법은 최후의 방법이고
위 상황에 원인으로 생각되는 부분은
pool에서 사용한 connection이 없어서 기다리다가 지정한 timeout 시간이 지나서
Error를 뱉었다.
connection갯수는 충분했고 그렇게 많이 잡아먹을 일도 없는데
그러면 왜 사용할 수 있는 connection이 없을까?
여기서 알 수 있는 원인은
"connection을 사용 후 pool에 반환을 하지 않았기 때문이다"입니다.
그래서 해당 코드 부분을 보니 생각했던 원인이 맞았습니다.
해당 코드에서 이슈가 발생하였는데요
throw를 할 게 아니라
try with resources구문을 사용하여 자원을 반환해줘야 됩니다.
위 코드를 보시면 분명 connection을 맺는 부분은 있는데
사용한 자원을 반환해주는 부분이 없죠
이렇게 바꿔주니 이슈가 발생하지 않게 되었습니다.
항상 기본에 충실해야 된다는 걸 다시 느끼게 됩니다.
'ETC' 카테고리의 다른 글
[ IntelliJ IDEA Ultimate ] M1 느린 현상 해결 (0) | 2023.10.31 |
---|---|
MSSQL 연결 시 드라이버가 SSL(Secure Sockets Layer) 암호화를 사용하여 SQL Sever로 보안 연결을 설정할 수 없습니다 (0) | 2023.10.11 |
[ LOMBOK ] @Build, @AllArgsConstructor, @NoArgsConstructor, @RequiredArgsConstructor (0) | 2022.12.08 |
의존성 주입 (0) | 2022.12.08 |
clean code[ 1 ] - 매핑관계 (0) | 2022.11.12 |