본문 바로가기
SingleStoreDB/Support Bulletin

[Support Bulletin 02] - SingleStore JDBC 및 rewriteBatchedStatements 옵션 사용 시 Parameter Capacity 초과 에러

by 에이플랫폼 [Team SingleStore Korea] 2025. 1. 16.

 

안녕하세요 에이플랫폼 Support Bulletin 시리즈입니다.

이번에는 DBMS를 사용할 때 중요한 요소인

JDBC와 ODBC에 관련한 에러 상황을 준비 했습니다.


 

🙌안내 사항

! SingleStore 는 MySQL 과 Wire Compatible 하므로 MySQL Client 또는 MySQL Driver 를 사용해도 대부분의 경우 큰 무리가 없습니다.

! 하지만 기능 및 성능에서 도움이 되기 때문에 SingleStore 에서 직접 제공하는 SingleStore Driver 를 사용하는 것이 권장됩니다.


📌개요

SingleStore JDBC Driver 의 특정 버전과 MySQL, MariaDB Driver 에서 rewriteBatchedStatements 옵션을 설정하면 다음과 같이 Parameter Capacity 초과 에러가 발생하는 경우를 소개합니다.

2024-10-18T01:07:14*125GMT [main] WARN 
com.singlestore.jdbc.message.server.ErrorPacket Error: 1956-HY000: Query cannot be 
completed because the parameter array capacity of 1048576 was exceeded 
java.sql.BatchUpdateException: (conn=42) Query cannot be completed because the 
parameter array capacity of 1048576 was exceeded
 

※아래는 예시 상황 입니다.※

원래 SQL

CREATE TABLE table1 (
   `id` INT(11) NOT NULL PRIMARY KEY,
   `full_name` VARCHAR(255),
   `email` VARCHAR(255)
);

INSERT INTO table1(id, full_name, email) VALUES (990691, "Hisako Saeli", "sukanyagreen235@att.org");
INSERT INTO table1(id, full_name, email) VALUES (600833, "Liping Igwe", "shojindlovu305@aliceadsl.com");
INSERT INTO table1(id, full_name, email) VALUES (787132, "Kun Kozłowski", "inga+herrera@blueyonder.com");
INSERT INTO table1(id, full_name, email) VALUES (653455, "Katarzyna König", "natalya-phillips@terra.dev");
INSERT INTO table1(id, full_name, email) VALUES (23992, "Francisca Einarsdóttir", "phonthip+soto706@yahoo.org");
 

 

rewriteBatchedStatements 활성화 후 병합된 SQL

INSERT INTO table1 (id, full_name, email) VALUES
    (990691, "Hisako Saeli", "sukanyagreen235@att.org"),
    (600833, "Liping Igwe", "shojindlovu305@aliceadsl.com"),
    (787132, "Kun Kozłowski", "inga+herrera@blueyonder.com"),
    (653455, "Katarzyna König", "natalya-phillips@terra.dev"),
    (23992, "Francisca Einarsdóttir", "phonthip+soto706@yahoo.org");

 

💡원인 1

SingleStore 는 SQL 에서 사용되는 상수를 변수로 치환하여 해당 SQL 을 재사용합니다. 이 때 상수를 변수로 치환하는 동작을 Parameterization 이라고 하며 하나의 SQL 에서 Parameter 로 치환할 수 있는 상수의 총 갯수는 엔진 변수 parametrizer_query_max_params 로 제어할 수 있습니다.

해당 엔진 변수는 기본 및 최대값이 1048576 로 설정되어 있으며 감소는 가능하지만 증가시켜 설정할 수 없습니다.

 

💡원인 2

MySQL 호환 JDBC Driver 를 사용할 때 rewriteBatchedStatements 를 설정하면 여러개의 반복적인 SQL 을 하나의 Batch 형태 SQL 로 변경하여 성능을 높일 수 있습니다.

예를 들어 10만건의 INSERT 문이 1건의 Batch 형태 INSERT 문으로 변경하면 Insert 성능이 비약적으로 향상됩니다. 하지만 이 경우 INSERT 에서 처리되는 Parameterization 대상 상수의 개수가 10만배로 증가하게 됩니다.

MySQL, MariaDB, SingleStore JDBC v1.2.3 이하 버전의 Driver 를 사용하는 경우 Batch 형태로 변경될 때 1048576개가 넘는 Parameterization 대상 상수에 대한 처리가 부족해 Capacity 초과 에러가 발생할 수 있습니다.


조치

SingleStore JDBC v1.2.4 이상의 Driver 를 사용하면 Parameterization 대상 상수가 1048576개를 넘지 않도록 Batch Size 를 자동으로 조절하여 SQL 을 작은 크기로 분할할 수 있게 수정되어 Capacity 초과 에러를 방지할 수 있습니다.

따라서 위와 같은 에러가 발생한다면 SingleStore JDBC v1.2.4 이상 버전을 사용하기를 권장합니다.

 

👉SingleStore 최신 버전 JDBC Driver 다운로드👈

위 링크의 공식 문서에서 사용하시는 호환성 메트릭스를 확인해보세요.


추가

데이터베이스 관리 툴로 많이 사용하시는 DBeaver에 SingleStore 클라이언트를 적용하는 방법에 대한 안내가 자세히 나온 링크를 하나 남겨드리면서 이번 포스팅은 마무리 하겠습니다.

👉DBeaver에 SingleStore 드라이버 적용하기👈