이번에 운영중인 서버에서 에러가 발생했다고 문의를 받았습니다.
오류는
Oracle.ManagedDataAccess.Client.OracleException (0x80004005) : 풀링된 접속 요청 시간이 초과되었습니다.
라는 메시지와 함께 저장이 안되는 이슈가 발생했는데
이때 커넥션 풀에 대한 오류라는걸 깨닫고...
커넥션 풀??? 그냥 DB랑 통신하는거~ 라고 막연하게만 알고 있어서 다시 한번 정리의 필요성을 느꼈습니다.
커넥션 풀이란?
연결 풀[1] 또는 커넥션 풀(connection pool)은 소프트웨어 공학에서 데이터베이스로의 추가 요청이 필요할 때 연결을 재사용할 수 있도록 관리되는 데이터베이스 연결의 캐시이다.
연결 풀을 사용하면 데이터베이스의 명령 실행의 성능을 강화할 수 있다.
각 사용자마다 데이터베이스 연결을 열고 유지보수하는 것은 비용이 많이 들고 자원을 낭비한다.
연결 풀의 경우 연결이 수립된 이후에 풀에 위치해 있으므로 다시 사용하면 새로운 연결을 수립할 필요가 없어진다. 모든 연결이 사용 중이면 새로운 연결을 만들고 풀에 추가된다.
연결 풀은 사용자가 데이터베이스에 연결을 수립하는데까지 대기해야하는 시간을 줄이기도 한다.
출처 : 위키백과(https://ko.wikipedia.org/wiki/%EC%97%B0%EA%B2%B0_%ED%92%80)
간단하게 설명하자면, DB와 통신을 할 때, 매번 연결을 맺고 끊고 다시 생성하고 하는 과정에서 비용이 많이 들기 때문에
이를 해결하기 위해서 커넥션 풀이라는 장소(캐시)에 미리 연결된 자원이 있으면 가져다 쓰고, 없으면 새로 생성해서 사용하고 반납하는것으로, 효율적으로 DB와 통신을 사용하기 위한 방법이라고 볼 수 있습니다.
그런데.. 그건 알겠는데 왜 저 문제가 생겼지???
asp.net의 경우에 커넥션 풀링 설정을 따로 안할경우 기본값은 true로 설정되고(Polling=true)
최대 풀 사이즈는 100개가 기본값입니다.(max pool size=100)
퍼포먼스 측정 결과 커넥션 풀링이 반납되지 않고 계속해서 쌓여서(lifetime은 기본 600초라서 반납되어야함)
최대 풀 사이즈인 100개보다 높아져서 생기는 문제라고 판단하였고 여기서 한가지 더 의문이 들었습니다.
using (OracleConnection conn = new OracleConnection(_connString))
{
if (conn.State != ConnectionState.Open)
conn.Open();
~~로직~~
}
위와 같은 형태라면 using문의 특성상 conn이 close 되어야하는데... 커넥션을 반납하지 않는건가??
네... 반납하지 않아요...
![](https://t1.daumcdn.net/keditor/emoticon/niniz/large/042.gif)
이후에 테스트를 위해서 명시적으로 conn.Close();를 해준 뒤 메서드를 종료하였고
이번에는 해당 문제가 발생하지 않는것으로 확인했습니다. 추후 운영 도중 문제가 더 발생시
커넥션을 어디서 오래 잡고 있는지 확인 후에
max pool size를 높일지 lifetime을 줄일지 고민을 해 봐야할 것 같습니다.
'DB > Oracle' 카테고리의 다른 글
Oracle 오늘 날짜 데이터 조회 (0) | 2022.06.28 |
---|