jdbc를 사용할 때, connection을 close 해 주지 않으면 어떤 일이 벌어질까요? 파일을 열어놓고 close를 안 하면 fd가 낭비되는 것처럼 connection이 계속 쌓이다가, connection이 고갈될 겁니다. jdbc mysql과 연동했을 때, connection을 해제를 해 주지 않았을 때, mysql server에서는 어떤 일이 일어나는지 변수값과 status를 보면서 알아보겠습니다.
먼저, show variables like '%con%'을 쳐 보겠습니다. 이것은 variable name에 con이 들어가는 것을 모두 찾습니다.
이 중에 max_connections가 보이는데요. 이 값은 문서에 따르면, 허용하는 클라이언트 연결 수의 최댓값을 의미합니다. 그리고 이 문서를 보면, 실제로 mysqld가 허용하는 컨넥션은 max_connections + 1임을 알 수 있어요. 151 + 1 = 152니까, 152개의 커넥션까지는 허용한다는 의미가 됩니다.
다음에, show status like '%conn%' 명령어를 쳐 보겠습니다. 이것은 status 중에 conn이 들어가는 상태값을 긁어 옵니다.
이 중에 Threads_connected를 보는 게 좋겠군요. 문서에 따르면, 오픈된 connections 수라고 되어 있기 때문입니다.
이제, GET /test api를 작성해 보겠습니다. 이것은, 제가 구축한 mysql server에 접속해서, mydb 데이터베이스에 있는 SPJ 테이블에 있는 내용들을 모두 긁어옵니다. 그런데, 17번째 줄을 보면, Connection을 얻어왔는데, 커넥션을 닫는 것이 없습니다. GET /test를 계속 호출해 봅시다. status를 보면 어떤 값이 계속 변하는지 알 수 있을 겁니다.
1번 호출했을 때, Thread_connected가 35가 되었습니다.
몇 번 더 GET /test를 호출했습니다. 그랬더니 Threads_connected가 151로 치솟았습니다. 그리고 이런 예외가 뜨게 되었습니다.
Too many connections. 즉 너무 많은 컨넥션을 가지고 있다는 의미입니다.
이제, 쿼리가 끝날 때 con.close()를 해 주는 코드를 추가해 봅시다. 즉, 컨넥션을 회수하는 로직을 추가하였습니다.
그러면, 어떻게 될까요? 10번 정도 GET /test를 호출해 봅시다.
아까와는 다르게 Threads_connected가 150까지 치솟지 않음을 알 수 있습니다.
'코딩 > Sql' 카테고리의 다른 글
mysql with 절 : 임시 결과를 정의하는 with 절을 알아봅시다. (2) | 2021.11.20 |
---|---|
mysql substring_index 함수를 이용해서 tokenize를 해 봅시다. (0) | 2021.09.30 |
postgresql sequence permission denied 오류를 dbeaver로 해결해 봅시다. (0) | 2021.08.17 |
postgresql auto increment 효과를 serial 형을 사용해서 구현해 봅시다. (0) | 2021.08.13 |
postgresql pg_authid로 유저 비밀번호를 조회해 봅시다. (0) | 2021.07.22 |
최근댓글