실행이 잘 되던 코드가 이런 에러를 발생하면서 실행이 되지를 않았다.
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초씩 쉬어주니깐 과부하가 발생하지 않았다.
'개발중 > troubleshooting' 카테고리의 다른 글
vue + java serve 안될 때 (0) | 2021.04.09 |
---|---|
Excel 파일 (지정된 파일을 찾을 수 없습니다) (0) | 2021.03.08 |
java.lang.NoSuchMethodException 클래스 이름.<init>() (0) | 2021.02.04 |
vue 한글 인코딩 (0) | 2021.01.21 |
Vue warnings potentially fixable with the `--fix` option. (0) | 2021.01.21 |