2016-09-19 19 views
4

私は1つのデータベーステーブルに200K行を挿入する必要があります。私はバッチあたり10,000を挿入するために、春にjdbcTemplate.batchUpdateを使用しようとしました。ただし、この処理には時間がかかりすぎます(200K行で7分)。だからデータベース側では、私はselect count(*) from table_Xによって挿入された行の数を確認します。私は行の数がわずかに10Kのinstaed増加を期待していた。誰が何が理由であるか説明することができますか、それはデータベース側で構成する必要がありますか?なぜspring jdbcTemplate batchUpdate行ごとに行を挿入する

PS:私は、Sybaseを使用しています....

+0

はあなたのコードを表示し、あなたはBatchPreparedStatementSetterを使用していますか?あなたのサービスやDAOで@Transactionalアノテーションを使用していますか? –

+0

@SheetalMohanSharma Springを使用するのではなく、ネイティブjdbc APIに切り替えて、自分でトランザクションを処理します。それは今働く。それはまだ非常に遅いです.... –

+0

効果的に私は問題を引き起こす可能性のある@Transactionalアノテーションを削除しました....しかし、私は侮辱を加速するためにそれを削除しました。 ...それは助けなかった –

答えて

1

接続文字列については、以下を設定してみてください - useServerPrepStmts=false&rewriteBatchedStatements=true。私のしおりから試したことはありません。これらの行を検索することができます。

Connection c = DriverManager.getConnection("jdbc:<db>://host:<port>/db?useServerPrepStmts=false&rewriteBatchedStatements=true", "username", "password"); 
+0

それはそれがそれのように見える ' sybaseのために働く:( –

+0

Hmmしかし、まだポストとそのポストのリンクをチェックする - それは助けるかもしれない –

+0

あなたの助言に感謝、私は解決を見つけると、私はこのポストを更新します –

5

Webで利用できるアプローチはたくさんあります。 パフォーマンスが直接、あなたが

  • テーブルのインデックスを使用している接続の
  • データベースサーバーと番号を使用している
  • JDBCドライバが挿入
  • のために遅さにつながる書かれている

    1. コードに依存します

      あなたのコードを見ることなく誰もが推測できるが、誰も正確な解決策を見つけることはできない。

      アプローチ1

      //insert batch example 
      public void insertBatch(final List<Customer> customers){ 
      
          String sql = "INSERT INTO CUSTOMER " + 
          "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)"; 
      
          getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() { 
      
          @Override 
          public void setValues(PreparedStatement ps, int i) throws SQLException { 
           Customer customer = customers.get(i); 
           ps.setLong(1, customer.getCustId()); 
           ps.setString(2, customer.getName()); 
           ps.setInt(3, customer.getAge()); 
          } 
      
          @Override 
          public int getBatchSize() { 
           return customers.size(); 
          } 
          }); 
      } 
      

      参照

      https://www.mkyong.com/spring/spring-jdbctemplate-batchupdate-example/

      http://docs.spring.io/spring-framework/docs/3.0.0.M4/reference/html/ch12s04.html

      アプローチ2.1

      //insert batch example 
      public void insertBatch(final List<Customer> customers){ 
          String sql = "INSERT INTO CUSTOMER " + 
           "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)"; 
      
          List<Object[]> parameters = new ArrayList<Object[]>(); 
      
          for (Customer cust : customers) { 
           parameters.add(new Object[] {cust.getCustId(), 
            cust.getName(), cust.getAge()} 
           ); 
          } 
          getSimpleJdbcTemplate().batchUpdate(sql, parameters); 
      } 
      Alternatively, you can execute the SQL directly. 
      
      //insert batch example with SQL 
      public void insertBatchSQL(final String sql){ 
      
          getJdbcTemplate().batchUpdate(new String[]{sql}); 
      
      } 
      

      refernce

      https://www.mkyong.com/spring/spring-simplejdbctemplate-batchupdate-example/

      アプローチ2.2

      public class JdbcActorDao implements ActorDao { 
          private SimpleJdbcTemplate simpleJdbcTemplate; 
      
          public void setDataSource(DataSource dataSource) { 
           this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource); 
          } 
      
          public int[] batchUpdate(final List<Actor> actors) { 
           SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(actors.toArray()); 
           int[] updateCounts = simpleJdbcTemplate.batchUpdate(
            "update t_actor set first_name = :firstName, last_name = :lastName where id = :id", 
            batch); 
           return updateCounts; 
          } 
      
          // ... additional methods 
      } 
      

      アプローチ2.3

      public class JdbcActorDao implements ActorDao { 
          private SimpleJdbcTemplate simpleJdbcTemplate; 
      
          public void setDataSource(DataSource dataSource) { 
           this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource); 
          } 
      
          public int[] batchUpdate(final List<Actor> actors) { 
           List<Object[]> batch = new ArrayList<Object[]>(); 
           for (Actor actor : actors) { 
            Object[] values = new Object[] { 
              actor.getFirstName(), 
              actor.getLastName(), 
              actor.getId()}; 
            batch.add(values); 
           } 
           int[] updateCounts = simpleJdbcTemplate.batchUpdate(
             "update t_actor set first_name = ?, last_name = ? where id = ?", 
             batch); 
           return updateCounts; 
          } 
      
          // ... additional methods 
      } 
      

      アプローチ3:JDBC

      dbConnection.setAutoCommit(false);//commit trasaction manually 
      
      String insertTableSQL = "INSERT INTO DBUSER" 
            + "(USER_ID, USERNAME, CREATED_BY, CREATED_DATE) VALUES" 
            + "(?,?,?,?)"; 
      PreparedStatement = dbConnection.prepareStatement(insertTableSQL); 
      
      preparedStatement.setInt(1, 101); 
      preparedStatement.setString(2, "mkyong101"); 
      preparedStatement.setString(3, "system"); 
      preparedStatement.setTimestamp(4, getCurrentTimeStamp()); 
      preparedStatement.addBatch(); 
      
      preparedStatement.setInt(1, 102); 
      preparedStatement.setString(2, "mkyong102"); 
      preparedStatement.setString(3, "system"); 
      preparedStatement.setTimestamp(4, getCurrentTimeStamp()); 
      preparedStatement.addBatch(); 
      preparedStatement.executeBatch(); 
      
      dbConnection.commit(); 
      

      refernce

      https://www.mkyong.com/jdbc/jdbc-preparedstatement-example-batch-update/

      /*Happy Coding*/ 
      
    +0

    あなたの返信ありがとうございます。実際には、挿入は10K行を含むバッチで効果的に行われますが、10K行では終了までに25〜30秒かかります。( –

    +0

    Sybase 15.5を使用していて、Sybase私はPostgreSQLと同じコードでテストしたので、PostgreSQLは10K行で1秒以下の時間を要しました。私はDBAチームにアドバイスを依頼しました。 –

    関連する問題