一括挿入データについて

8235 ワード

テストデータベースはmysql!!!
方法1:public static void insert () {          //          Long begin = new Date ().getTime();          // sql          String prefix = "INSERT INTO tb_big_data (count, create_time, random) VALUES " ;          try {              // sql              StringBuffer suffix = new StringBuffer();              //              conn.setAutoCommit( false );              // Statement st = conn.createStatement();              // st,pst              PreparedStatement pst = conn.prepareStatement( "" );              // ,              for ( int i = 1; i <= 100; i++) {                  //                  for ( int j = 1; j <= 10000; j++) {                      // sql                      suffix.append( "(" + j * i + ", SYSDATE(), " + i * j                              * Math.random() + ")," );                  }                  // sql                  String sql = prefix + suffix. substring (0, suffix.length() - 1);                  // sql                  pst.addBatch(sql);                  //                  pst.executeBatch();                  //                  conn. commit ();                  //                  suffix = new StringBuffer();              }              //              pst. close ();              conn. close ();          } catch (SQLException e) {              e.printStackTrace();          }          //          Long end = new Date ().getTime();          //          System. out .println( "cast : " + ( end - begin ) / 1000 + " ms" ); :     }
出力時間:cast:23 ms
この方法は現在テストが最も効率的な方法です!
 
方法2:
  public static void insertRelease() {          Long begin = new Date ().getTime();          String sql = "INSERT INTO tb_big_data (count, create_time, random) VALUES (?, SYSDATE(), ?)" ;          try {              conn.setAutoCommit( false );              PreparedStatement pst = conn.prepareStatement(sql);              for ( int i = 1; i <= 100; i++) {                  for ( int k = 1; k <= 10000; k++) {                      pst.setLong(1, k * i);                      pst.setLong(2, k * i);                      pst.addBatch();                  }                  pst.executeBatch();                  conn. commit ();              }              pst. close ();              conn. close ();          } catch (SQLException e) {              e.printStackTrace();          }          Long end = new Date ().getTime();          System. out .println( "cast : " + ( end - begin ) / 1000 + " ms" );      }
 
コンソール出力:cast:111 ms
実行時間は上記の方法の5倍です!
 
方法3:public static void insertBigData(SpringBatchHandler sbh) {          Long begin = new Date ().getTime();          JdbcTemplate jdbcTemplate = sbh.getJdbcTemplate();          final int count = 10000;          String sql = "INSERT INTO tb_big_data (count, create_time, random) VALUES (?, SYSDATE(), ?)" ;          jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {              // prepared statement 。              public void setValues(PreparedStatement pst, int i)                      throws SQLException {                  pst.setLong(1, i);                  pst.setInt(2, i);              }
               //              public int getBatchSize() {                  return count ;              }          });          Long end = new Date ().getTime();          System. out .println( "cast : " + ( end - begin ) / 1000 + " ms" );      }
 
この方法はspring batchUpdateで実行され、効率の問題でデータ量は1万本しかありません!
実行時間:cast:387 ms
 
 
まとめ:方法1と方法2はよく似ていて、唯一違うのは方法1が採用したのは「insert into tb(...)values(...),(...)...;”のように挿入操作を行い、
方法2は「insert into tb(...)values (...);insert into tb (...) values (...);...”の方法で、テストでなければ、私も両者の差がこんなに大きいことを知りません!
もちろん、これは現在のテストにすぎず、具体的な実行時間とステップ長も大きく関係しています.歩幅を100に変更すると、方法は数分かかるかもしれませんが、これは自分でテストすることができます.の
方法三網では推奨されているが、効率は誰もが見ているように、1万件の記録で、6分もかかり、効率が理想的ではないことがわかる.さらにメソッド3はspringアプリケーションContext環境を構成しなければ適用できません!
しかし、方法3はssh/spring-mvcで可用性が高い!