안녕하세요 에이플랫폼의 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 클라이언트를 적용하는 방법에 대한 안내가 자세히 나온 링크를 하나 남겨드리면서 이번 포스팅은 마무리 하겠습니다.
'SingleStoreDB > Support Bulletin' 카테고리의 다른 글
[Support Bulletin 01] - SingleStore Service Autostart 실패 (0) | 2025.01.13 |
---|