예전에 특정 api에서 트랜잭션을 위한 connectoin생성후 release를 하지 않았더니 db에 접근시
timeout되어 서버를 리부트해야 정상작동되는 경험이 있었다.그때는 이유를 몰랐는데 최근 관련글을 찾게되어
정리해 보았다.
typeorm의 커넥션은 실제로 커넥션을 생성하는것이 아니라 커넥션풀을 생성하는것이다.실제의 커넥션을 생성하려면 queryRunner
로 독립된 커넥션을 생성해야 된다.커넥션풀은 createConnection
함수에 설정된 대로 서버 실행시 최초로 한번 생성된다.데이터베이스와 통신후 close
를 호출하여 Disconnection
해야하지만 실질적으로 서버가 종료되지 않는 한 close
를 하지 않는다.
커넥션을 생성하면 미리 생성된 커넥셔풀에서 하나의 접근권한을 가져오고 다른 커넥션에서 접근할 수 없게 된다.커넥션을 사용하면 다른사람이 사용할 수 있게 반납을 해야 한다.
단일 쿼리를 실행하는 경우 자동으로 커넥션을 가져와서 pool.query()
실행 후 커넥션을 반납한다.하지만 하나의 커넥션에서 여러 쿼리를 수행하고자 할때는 독립된 커넥션을 수동으로 생성 후 여러쿼리 실행 후 커넥션을 수동으로 반납해야 한다.수동으로 커넥션을 가져올경우 커넥션state
가 생성되어 여러작업간에 이 state
상태를 공유할 수 있다.2개의 연속적인 pool.query()
실행은 다른 커넥션풀을 사용할 수도 있으며 병렬적으로 실행된다.
수동으로 커넥션을 가져왔는데 반납하지 않는다면 커넥션풀은 고갈되고 곧 사용되는 않지만 사용할 수 없는 idle
커넥션만 남게 되어 deadlock
이 발생한다.
참고
https://stackoverflow.com/questions/57121227/why-do-we-need-to-release-connection-when-using-connection-pool-in-mysql
https://orkhan.gitbook.io/typeorm/docs/connection
https://techblog.woowahan.com/2664/