본문 바로가기

소프트웨어-이야기/프로그래밍 언어와 프레임워크

(Django) DB Connection을 관리하는 방법

Connection 재사용 ( Persistent connections )

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

Request가 날라올 때마다 Connetion을 새로 맺는건 부담이 큰 작업이다. 그래서 Django에는 CONN_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이 정상동작하는지 내부적으로 확인한다.

💣 Thread 사용 시 주의 사항

  • 각 Thread는 자신만의 DB Connection을 갖고 있기 때문에, 데이터베이스는 Thread의 개수만큼은 커넥션을 받아줄 수 있어야한다.
    • Thread를 1개 만든다는 것은 DB Connection이 하나 더 생긴다는 것을 의미한다. )

💣 Persistent connections 주의 사항

  • 데이터베이스 접근이 빈번하지 않는 경우, CONN_MAX_AGE 값을 낮게 설정해놓는게 좋다.
    • 사용되지 않는 Connection이 오랜시간 유지되는 것을 줄일 수 있기 때문이다. 
    • DB가 자주 사용되지 않는 케이스로는 데이터를 중간에 캐싱 처리한 케이스 등이 있을 수 있다.
  • 로컬 개발 환경에서는 각 요청이 별도의 쓰레드로 동작하기 때문에, Rersistent Connection 효과를 볼 수 없다.
  • Persistent connections을 사용하고 있고, 배치 스크립트에서 MultiThread를 사용하는 경우, Connection이 닫히지 않고 계속 남아있을 수 있다. 이 때는, 스크립트가 종료되기 전에 명시적으로 Connection을 닫아줘야한다.