데이터 삽입을 위해 JDBC를 사용하여 MySQL 데이터베이스에 연결할 때 특히 대량의 데이터 배치가 지속적으로 삽입됩니다 (100,000). 효율성을 향상시키는 방법?
JDBC 프로그래밍 인터페이스에는 특히 주목할만한 두 가지 설명 방법이 있습니다.
AddBatch () 및 executeBatch() 메소드 addBatch() 사용하여 데이터의 배치 처리를 달성 할 수 있습니다.
그러나 먼저 데이터베이스 링크, connection.setAutoCommit(false) 에서 수동 커밋을 설정 한 다음 명령문이 실행 된 후 connection.commit() 실행해야한다는 점에 주목할 가치가 있습니다.
import java.io.bufferedReader; import java.io.ioexception; import java.sql.drivermanager; import java.sql.sql.sql.sql.sql.sql.sql.sql.sql.sql.sql.sql.sql.sql.sqlexcept; import java.util.date; import com.mysql.jdbc.connection; virtual classmysqlbatchutil {public classmys qlbatchUtil {public classe; sql = "db_test에 삽입 (param1, param2, param3, param4, param5) 값 (?,?,?,?)"; 개인 문자열 charset = "UTF-8"; 개인 문자열 connectstr = "jdbc : mysql : // localhost : 3306/test"; 개인 문자열 username = "루트"; 개인 문자열 비밀번호 = "123456"; private void dostore ()는 classNotFoundException, sqlexception, ioexception {class.forname ( "com.mysql.jdbc.driver")을 던집니다. ConnectStr += "? useerVerpRepStmts = false & rewritebatchedStatements = true"; // 효율적인 배치 삽입에 대한 테스트가 있으며, 실행 후 정상 배치 삽입이 제거됩니다. Connect Conn = (Connection) DriverManager.getConnection (ConnectStrs, Username, Password); conn.setAutocommit (false); // 수동 제출 설정 int count = 0; PREPEDATEMENT PSTS = CONN.PREPARESTATEMENT (SQL); 문자열 라인 = null; 날짜 시작 = 새 날짜 (); for (int i = 0; i <= 100000; i ++) {psts.setString (1, i+"param1"); psts.setString (2, i+"param2"); psts.setString (3, i+"param3"); psts.setString (4, i+"param4"); psts.setString (5, i+"param5"); psts.addbatch (); // 배치 처리 카운트 추가 ++; } psts.executebatch (); // 배치 프로세스 실행 conn.commit (); // 날짜 제출 종료 = 새 날짜 (); System.out.println ( "수량 ="+count); system.out.println ( "runtime ="+(end.gettime ()-시작 .gettime ())); conn.close (); } public static void main (String [] args) {try {new mysqlbatchutil (). dostore (); } catch (classNotFoundException e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } catch (ioexception e) {e.printstacktrace (); }}}테스트 결과 :
수량 = 1000001
실행 시간 = 4725
총 10W 및 실행 시간은 47 초가 걸립니다.
이 효율은 여전히 높지 않으며 원하는 효과를 달성하지 못하고 추가 개선이 필요합니다.
매개 변수는 MySQL JDBC Connection String에 추가 할 수도 있습니다.
REWRITEBATCHEDSTATEMENTS = true
MySQL은 기본적으로 배치 처리를 해제 했으며이 매개 변수를 통해 켜집니다. 이 매개 변수는 데이터베이스에 제출 된 SQL 문을 다시 쓸 수 있습니다.
useerErverPrepStmts = false
활성화되지 않은 경우 (audeserverprepStmts = false) 로컬 SQL 어셈블리에 com.mysql.jdbc.preparedstatement를 사용하여 DB로 보냅니다. 교체 된 최종 SQL입니다.
다음은 약간의 개선 사항입니다. 연결 문자열에 다음 문을 추가합니다 (코드 생성자의 주석 제거).
ConnectStr += "? useerErverPrepStmts = false & rewritebatchedStatements = true";
테스트 결과는 다음과 같습니다.
수량 = 1000001
실행 시간 = 1213
동일한 양의 데이터를 사용하면 이번에는 실행하는 데 12 초 밖에 걸리지 않아 처리 효율이 크게 향상되었음을 보여줍니다. 하하
위는 JDBC를 사용하여 10W 데이터를 MySQL 데이터베이스 배치에 삽입하는 테스트 효율성입니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!