본문 바로가기

개발중/troubleshooting

[mybatis 에러 해결] Packet for query is too large (34530395 > 20971520). You can change this value on the server by setting the max_allowed_packet' variable.

728x90
반응형

실행이 잘 되던 코드가 이런 에러를 발생하면서 실행이 되지를 않았다.

Packet for query is too large (34530395 > 20971520). 
You can change this value on the server by setting the max_allowed_packet' variable.

 


mysql의 max_allowed_packet 설정값

mysql이 클라이언트와 통신할 때 핸들링 할 수 있는 데이터의 양을 의미합니다.

 

디폴트로는 1mb로 설정되어 있습니다.

 

mysql 3.23버젼에선 이 값을 16mb까지 설정할 수 있고

4.0.1 이상부터는 1기가까지 가능합니다.

 

대량의 데이터를 mysql과 주고받을땐 connect timeout 시간이나 (혹시 server-side script를 이용한다면) 스크립트의 timeout시간도 확인해봐야 하며,

timeout의 값이 충분히 설정되어 있다면 다음으로 max_allowed_packet의 값을 의심해봐야 합니다.

 

이 값은 mysql에 입력하는 데이터의 양 뿐만 아니라,

리턴되는 데이터의 양과도 관련이 있습니다.

 

따라서 대량의 데이터를 리턴받아야 하는 상황 (blob data type같은..)이 요구될때도 설정값을 살펴봐야 합니다.

 

mysql.com에서는 이 값을 적당히 늘려주는 것이 더 좋다고(안전하다고) 밝히고 있습니다.

 

mysql은 지정된 값만큼 항상 memory를 가지고 있는 것이 아니라, 필요한 양 만큼의 메모리만 (단, max_allowed_packet의 값에 제한받습니다.) 사용합니다


 

실행중 변경해 주는 방법

show variables;

SET GLOBAL max_allowed_packet = 1024 * 1024 * 32;
SET SESSION max_allowed_packet = 1024 * 1024 * 32;

 

mysql 실행할때 변경해 주는 방법

shell> mysqld --max_allowed_packet=32M

 

mysql 설정파일에서 변경해 주는 방법

mysql의 설정파일(mysql.ini)에서 [mysqld] 섹션에서 max_allowed_packet=32M 와 같이 적당한 값으로 변경하거나 추가해 준다.

[mysqld]

max_allowed_packet=32M

 


 

쿼리 작성을 했더니

 

 

위 와 같은 에러가 떨어졌다.

 

선배님이 해결해 주셨다. 서버의 문제라고 했다. :)

근데 회사 서버라 우리가 접근할 수 없는 부분이었다.

 

대량의 데이터( 총 10,000건의 Data )를 쿼리에 던지다보니 과부하로 인해 생긴 문제이므로 

100건 단위로 List 로 묶어서 던지고 

Thread.sleep(3000);

쓰레드로 3초씩 쉬어주니깐 과부하가 발생하지 않았다.

728x90
반응형