广

Java编程

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    java 下执行mysql 批量插入的几种方法及用时

    2018-11-02 13:11:43 次阅读 稿源:互联网
    零七广告

    方法1:

    Java code
    代码如下:

    conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASS);
            pstmt = conn
                    .prepareStatement("insert into loadtest (id, data) values (?, ?)");
            for (int i = 1; i <= COUNT; i++) {
                pstmt.clearParameters();
                pstmt.setInt(1, i);
                pstmt.setString(2, DATA);
                pstmt.execute();
            }

    MyISAM:246.6秒、InnoDB:360.2秒

    方法2: 使用事务,不自动commit

    Java code
    代码如下:

    conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASS);
            conn.setAutoCommit(false);
            pstmt = conn
                    .prepareStatement("insert into loadtest (id, data) values (?, ?)");
            for (int i = 1; i <= COUNT; i++) {
                pstmt.clearParameters();
                pstmt.setInt(1, i);
                pstmt.setString(2, DATA);
                pstmt.execute();
                if (i % COMMIT_SIZE == 0) {
                    conn.commit();
                }
            }
            conn.commit();

    InnoDB:31.5秒

    方法3: executeBatch

    Java code
    代码如下:

    conn = DriverManager.getConnection(JDBC_URL
                    + "?rewriteBatchedStatements=true", JDBC_USER, JDBC_PASS);
            conn.setAutoCommit(false);
            pstmt = conn
                    .prepareStatement("insert into loadtest (id, data) values (?, ?)");
            for (int i = 1; i <= COUNT; i += BATCH_SIZE) {
                pstmt.clearBatch();
                for (int j = 0; j < BATCH_SIZE; j++) {
                    pstmt.setInt(1, i + j);
                    pstmt.setString(2, DATA);
                    pstmt.addBatch();
                }
                pstmt.executeBatch();
                if ((i + BATCH_SIZE - 1) % COMMIT_SIZE == 0) {
                    conn.commit();
                }
            }
            conn.commit();

    InnoDB:5.2秒

    上面的使用时必须
    1)rewriteBatchedStatements=true
    2)useServerPrepStmts=true

    方法4:先LOAD再COMMIT

    Java code
    代码如下:

    conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASS);
            conn.setAutoCommit(false);
            pstmt = conn.prepareStatement("load data local infile '' "
                    + "into table loadtest fields terminated by ','");
            StringBuilder sb = new StringBuilder();
            for (int i = 1; i <= COUNT; i++) {
                sb.append(i + "," + DATA + "/n");
                if (i % COMMIT_SIZE == 0) {
                    InputStream is = new ByteArrayInputStream(sb.toString()
                            .getBytes());
                    ((com.mysql.jdbc.Statement) pstmt)
                            .setLocalInfileInputStream(is);
                    pstmt.execute();
                    conn.commit();
                    sb.setLength(0);
                }
            }
            InputStream is = new ByteArrayInputStream(sb.toString().getBytes());
            ((com.mysql.jdbc.Statement) pstmt).setLocalInfileInputStream(is);
            pstmt.execute();
            conn.commit();

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七广告
    零七广告
    零七广告
    零七广告