본문 바로가기
C#

[C#,MSSQL] The timeout period elapsed prior to obtaining a connection from the pool 에러 해결

by 아마도개발자 2023. 11. 19.

 

아마도 이 에러는 내가 겪은 에러 중 가장 어이없는 에러인 것 같다. 

내가 만든 앱에서 에러가 발생했다는 소식을 듣고 내 폰으로 앱을 실행해보니 실제로 로그인이 되지 않는 현상이 발생했다. 계속해서 Timeout이 발생했고, 주말에 서버 정기점검이 있다는 것이 생각난 나는 디비 서버에 문제가 생겼다고 의심을 하며 서둘러 회사로 향했다. 

 

그런데 사무실에 도착해서 앱을 실행해보니, 놀랍게도 앱이 정상실행 되었다.

 

 

갑자기 고쳐져서 어이가 없는 와중에 우선 문제가 무엇이었는지 확인하기 위해 로그파일을 열었다

 

2023-11-19 10:45:26 | ERROR | The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

 

정확한 뜻은 몰랐지만, 커넥션 풀이 모두 사용되었고, 내가 설정한 max pool size에 도달했다는 의미로 해석하였다. 그렇다면 왜 모든 커넥션 풀이 사용된 걸까? 해답은 간단했다.

 

db와의 커넥션을 open한 뒤에 close를 하지 않아 connection leak이 일어난 것이다! 모든 디비 연결 로직은

// Example.cs

void SomeFunction()
{
	var connection = new SqlConnection(connectionString);
    connection.Open();
    
    // Business Logic ~~
    
    connection.Close();          
}

 

이렇게 connection을 확실하게 닫아 주거나

 

using (SqlConnection connection = new SqlConnection(connectionString))
{
     connection.Open();
     someCall(connection);
}

 

using block을 사용하여 managed objects( SqlConnection과 SqlCommand)가 자동으로 닫히고, dispose되도록 관리해주어야 한다는 것이다. 실제로 일부 코드에서 커넥션을 닫아주는 코드가 빠져 있었고, 그 것들이 쌓여서 에러를 발생시킨 것이다. 

 

 

 

그렇다면, 왜 내가 회사에 도착하자마자 문제가 해결된걸까?

그것은 모르겠다. 자연치유 한것이 아닐까..? 아마도..