jdbctemplete批量处理优化

1.spring.datasource.url = jdbc:mysql://192.168.15.44:3306/ml_test?useSSL=false&useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true&autoReconnect=true
加rewriteBatchedStatements=true开启mysql批量处理
从底层代码来说,不打开会一条一条执行不会批处理
2.加事务
3.jdbctemplete理论上10万每次5万条,需要分批处理

源码:


public int[] batchUpdate(String sql, final BatchPreparedStatementSetter pss) throws DataAccessException {
 
    return execute(sql, new PreparedStatementCallback<int[]>() {
      public int[] doInPreparedStatement(PreparedStatement ps) throws SQLException {
        try {
          int batchSize = pss.getBatchSize();
          InterruptibleBatchPreparedStatementSetter ipss =
              (pss instanceof InterruptibleBatchPreparedStatementSetter ?
              (InterruptibleBatchPreparedStatementSetter) pss : null);
          if (JdbcUtils.supportsBatchUpdates(ps.getConnection())) {
            for (int i = 0; i < batchSize; i++) {
              pss.setValues(ps, i);
              if (ipss != null && ipss.isBatchExhausted(i)) {
                break;
              }
              ps.addBatch();
            }
            return ps.executeBatch();
          }
          else {
            List<Integer> rowsAffected = new ArrayList<Integer>();
            for (int i = 0; i < batchSize; i++) {
              pss.setValues(ps, i);
              if (ipss != null && ipss.isBatchExhausted(i)) {
                break;
              }
              rowsAffected.add(ps.executeUpdate());
            }
            int[] rowsAffectedArray = new int[rowsAffected.size()];
            for (int i = 0; i < rowsAffectedArray.length; i++) {
              rowsAffectedArray[i] = rowsAffected.get(i);
            }
            return rowsAffectedArray;
          }
        }
        finally {
          if (pss instanceof ParameterDisposer) {
            ((ParameterDisposer) pss).cleanupParameters();
          }
        }
      }
    });
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值