나는 로그 파일을 분석하고 방대한 양의 데이터를 데이터베이스에 삽입하는 응용 프로그램을 가지고있다. Java로 작성되었으며 JDBC를 통해 MySQL 데이터베이스와 통신합니다. 필자는 특정 유스 케이스에서 가장 빠른 데이터를 찾기 위해 여러 가지 방법을 실험했습니다. 현재 최고의 공연이 될 것 같다 하나는 다음과 같이 확장 삽입 (여러 행 예를 들어, 하나의 삽입)를 발행하는 것입니다문자열을 작성하지 않고 JDBC를 사용하여 확장 삽입을 수행하는 방법은 무엇입니까?
는INSERT INTO the_table (col1, col2, ..., colN) VALUES
(v1, v2, v3, ..., vN),
(v1, v2, v3, ..., vN),
...,
(v1, v2, v3, ..., vN);
행의 수는 수만이 될 수 있습니다.
나는 준비된 문장을 사용해 보았지만 아무런 차이가 없었습니다. 왜냐하면 각 삽입물이 여전히 DB에 개별적으로 보내졌고 테이블을 잠궈 둘 필요가 있기 때문입니다. 내 앞에있는 코드에서 일한 동료는 일괄 처리를 사용해 보았지만 성능이 좋지 않았습니다.
확장 삽입을 사용한다는 것은 SQL 문자열을 직접 작성해야한다는 것을 의미합니다 (행 수가 가변적이기 때문에). 모든 종류의 SQL 주입 벡터를 열 수 있다는 것을 의미합니다. 나는 내 자신을 발견 할 정도로 지능이 없습니다. 이렇게하는 더 좋은 방법이 있어야합니다.
분명히 내가 삽입 한 문자열을 제외하고는 단지 str.replace("\"", "\\\"");
(', ?, \에 대해 반복)과 같은 것으로 만 이스케이프하지만 분명히 충분하지 않을 것이라고 확신합니다. + 일괄 삽입
하나의 삽입 물 또는 여러 물을 발행합니까? 또는 배치 작업을 통해 많은 준비된 명령문을 발행하는 간접비가 없어지 는가? – Theo
일괄 처리는 준비된 명령문의 오버 헤드를 최소화해야합니다 – dfa
+1 실제 코드 –