-
Notifications
You must be signed in to change notification settings - Fork 4
NestJS 와 MySQL 간의 커넥션 풀
NestJs로 부하테스트를 하는 중, 성능 개선 방안을 생각해보던 중, 코드를 짤 때 커넥션 풀 설정을 하지 않았던 것이 생각났다.
평소에도 커넥션 풀을 설정하지 않았기에, 커넥션 풀이 정확히 뭔지, 어떻게 사용하는 건지 몰라 공부를 했다.
커넥션 풀은 단일 커넥션 객체들을 풀에서 관리하여 커넥션 객체를 재사용할 수 있게 해준다. (필요할 때 빌려주고 사용하면 돌려받는 방식)
커넥션 풀을 설정할 때, 한 테스크에 필요한 커넥션보다 적은 커넥션이 존재하면 교착상태(dead lock)에 빠질 수 있다.
예를 들면, 하나의 테스크에 커넥션이 2개가 필요한데, 커넥션 풀의 최대 커넥션이 1개라면 다른 1개의 커넥션이 생길 때까지 기다리게 되기 때문이다.
TypeORM의 커넥션 연결 방식을 알아봤는데, getConnection(), createConnection(), getRepository(), getManager() 이 커넥션 객체를 사용하는 것이다.
그리고 MySQL Driver의 Connection Pool
의 size
기본값은 10
이고, 커넥션을 사용하지 않으면 풀로 반환하므로, 커넥션을 따로 관리할 필요가 없어 보인다.
{extra: connectionLimit: n}
의 옵션 설정으로 커넥션 풀의 사이즈를 정할 수 있는데, 이 사이즈를 조절하므로써 성능 개션의 여지도 보인다.
queryRunner 는 별도의 커넥션을 사용한다고 한다. 하지만 이는 수동으로 release 해줬으므로 큰 문제가 없어보인다.
또한, 일정 시간 이상 수행한 쿼리는 캐시 옵션을 활성화하여 성능을 개선할 수 있는 것으로 보인다.
관련 자료 : typeorm, mysql, cache, connection 모니터링