Connection pool

2023. 1. 6. 19:31ETC

반응형

 

 

우리가 만든 앱에서 DB와 connection을 맺어서 CRUD를 이용하는데요.

 

여기서 DB와 connection을 맺는 행위 자체가

Cost가 되게 큰 행위입니다.

 

DB를 사용할 때마다 connection을 맺고 다 쓰면 끊고,

이 행위를 반복한다면 App의 퍼포먼스도 현저히 떨어지게 되겠죠?

 

그렇기에 Connection pool이라는 방법을 이용하여

connection을 관리하게 됩니다.

 

Connection Pool 구조

위 사진 처럼 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을 맺는 부분은 있는데

사용한 자원을 반환해주는 부분이 없죠

 

이렇게 바꿔주니 이슈가 발생하지 않게 되었습니다.

 

항상 기본에 충실해야 된다는 걸 다시 느끼게 됩니다.

반응형