이러쿵저러쿵


ASP.NET 서비스 중에 아래와 같은 오류를 만나는 경우가 있습니다.

 

'/' 응용 프로그램에 서버 오류가 있습니다.

 

제한 시간이 만료되었습니다. 풀에서 연결을 만들기 전에 제한 시간이 경과되었습니다. 풀링된 연결이 사용 중이었거나 최대 풀 크기에 도달했기 때문일 수 있습니다.

 

설명: 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 스택 추적을 검토하여 발생한 오류 및 코드에서 오류가 발생한 위치에 대한 자세한 정보를 확인하십시오.
 
예외 정보: System.InvalidOperationException: 제한 시간이 만료되었습니다. 풀에서 연결을 만들기 전에 제한 시간이 경과되었습니다. 풀링된 연결이 사용 중이었거나 최대 풀 크기에 도달했기 때문일 수 있습니다.

 

소스 오류 ...

 

사실 오류 내용은 명확합니다.

 

아주 초보적인 실수이기도 하지만, 특별한 주의 없이 코드를 작성하다보면 깜빡하다 놓치지 쉬운 에러일 수도 있습니다.

 

에러 내용을 보면 DB의 커넥션 풀이 꽉 차게 되었다고 하는데(최대 풀 크기에 도달), 그 이유는 DB와의 커넥션을 연결만 하고, 해제 처리를 제대로 하지 않으면 풀 자체가 꽉 차게 되기 때문입니다.

DB에 접속하여 Open 을 하였다면 DB작업이 완료된 다음 반드시 DB Close 처리를 해주어야 합니다.

 

DB Open 과 Close 를 처리해 주는 별도의 프로세스를 만들어 사용하지 않고, DB의 Open과 Close를 일일이 필요할 때마다 사용하는 경우에 자주 발생하는 것 같습니다. (사람이기 때문에 종종 깜빡하고 빼먹을 수도 있지요.^^)
 

 

 

 

문제 해결 방법은 간단합니다.

 

Open을 해주었으면 Close 해주면 됩니다.

 

 

 

 

 

커넥션 풀(Connection Pool)은 간단히 데이터베이스 접속 상태를 메모리 내에서 유지하고 있는 여러개의 접속 통로 모음(데이터베이스 접속 캐시)라고 생각하시면 됩니다. DB에 질의(쿼리)를 하기 위해서는 매번 DB에 연결하고, 끊는 동작을 해야 하는데, 매 질의 때마다 이러한 동작을 반복하는 것은 DB에게 부담을 줄 뿐만 아니라 단순 질의 처리보다 연결 동작에 대한 시간과 비용이 더 소모되는 경우도 있습니다.

 

그렇기 때문에 서버에서는 DB에 접속된 상태의 객체(캐시)들을 여러개 만들어 놓고, 클라이언트로부터 DB 질의 요청이 오면 해당 DB접속 객체 중에 사용 가능한 객체(통로)를 이용하여 바로 DB에 질의할 수 있습니다. 또한 처리가 끝나면 커넥션 자체를 끊는 것이 아니라, 대기 시키고, 다른 질의 요청이 오면 이를 재사용 합니다.

 

보통 커넥션 풀은 지정된 개수만큼 미리 DB접속 커넥션을 초기 생성시켜 놓고, 클라이언트로부터 요청이 오면 이 범주 내에서 사용하게 됩니다. 만약 클라이언트의 요청이 더 많은데, 커넥션 풀에 있는 DB커넥션이 모두 사용중이라면 커넥션 풀은 추가로 커넥션을 생성합니다. 단 추가로 생성되는 커넥션에는 최대 제한이 있습니다. (시스템 자원이나 DB 상태에 따라 무제한 커넥션을 늘릴 수는 없습니다.)

위의 초기 생성 개수나 최대 생성 개수는 직접 지정할 수 있습니다.

 

즉 위의 에러가 발생한 경우는 커넥션 풀에서 생성 가능한 경우까지 모두 DB커넥션을 생성하였지만, 계속해서 사용된 DB커넥션이 반환되지 않고, 생성할 수 있는 최대치에 도달하였기 때문입니다. (그래서 이런 에러의 경우는 보통 한 번 발생하면 웹 서버를 초기화/재시작 하기 전까지는 계속 발생하게 됩니다.)

 

사실 정말 사용자가 많아서 발생하는 경우도 있겠지만, 대부분은 DB커넥션 자원을 적절하게 반환하지 않아 발생하는 경우가 더 많습니다.

 

 

 

저작자 표시 비영리 변경 금지
신고

Comment +0

티스토리 툴바