본문 바로가기

소프트웨어 이야기/장고와 루비온레일즈

(Django)데이터베이스 커넥션을 관리하는 방법

 Connection 재사용

Django는 데이터베이스에 쿼리를 처음 날리기 전에 Connection을 맺는다. 그리고 커넥션을 계속 열어뒀다가, 다음 요청이오면 이걸 재사용한다.

Request가 날라올 때마다 Connetion을 새로 맺는건 부담이 큰 작업이다. 그래서 Django에는 CON_MAX_AGE라는 설정값이 있다. 여기에 설정된 기간만큼 Connection을 닫지않고, 보존하겠다는 개념이다. 

따로 설정해주지 않으면 0으로 설정된다. 즉, Connection을 매번 만들고, 닫겠단 이야기다. 그리고 만약 Connection의 사용기간에 제한을 두고 싶지 않으면, None을 설정해주면 된다. ( Persistent Connections )


Connection은 어떤 경우에 닫힐까?

지정해놓은 Connection 유지 기간이 지난 경우이거나, 오랜 시간동안 connection이 안쓰인 경우 Django는 Connection을 닫는다. 


Connection은 언제 닫힐까?

장고는 request 처리가 시작될 때, 끝날 때, 처리 도중에 데이터베이스 에러가 발생했을 때 Connection을 닫는다. Request 처리 중에 데이터베이스에서 에러가 발생했는데, 재사용이 불가능한 상태가 된다면 Connection을 닫아버린다. 데이터베이스 에러는 한 Request를 처리하는데에 전반적인 영향을 미친다. 이렇게 Connection을 사용할 수 없게 된다면, 다음 request를 처리할 때는 새로운 Connection을 얻게 된다.


Django 코드 살펴보기

request 시작 / 종료 시점에 connection을 닫는 로직은 /django/db/__init__.py에 있다.


connection을 닫는 로직은 django/db/backends/base/base.py에 있다. errors_occurred는 에러가 발생하면, 값이 true으로 변경된다. ( django/db/utils.py > __exit__ 함수 ) 


connection이 사용가능한 상태인지 확인하는건 각 데이터베이스 adapter 라이브러리에 작성되어 있다. postgresql을 사용하는 경우, SELECT 1 쿼리를 호출해서 Connection이 정상동작하는지 내부적으로 확인한다.


주의할점

A. 각 스레드는 자신만의 Connection을 갖고 있기 때문에, 데이터베이스는 쓰레드의 개수만큼은 커넥션을 받아줄 수 있어야한다.

B.데이터베이스가 자주 사용되지 않는 경우, CON_MAX_AGE 값을 낮게 설정해놓는게 좋다. 그러면 데이터베이스에 동시에 연결되는 Connection 수를 줄일 수 있다. 

( 데이터베이스가 자주 사용되지 않는 케이스로는 데이터를 중간에 캐싱 처리한 케이스 등이 있을 수 있다)