簡體   English   中英

Spring集成JDBC批量插入

[英]Spring Integration JDBC Batch Insert

我需要插入要插入數據庫的POJO列表。 我有一個存儲過程,一次執行一次插入。 在當前的實現中,我有一個拆分器,它拆分POJO並將該有效負載傳遞給存儲的proc出站網關以調用我的存儲過程。

在實時場景中,我的列表大小可能高達500K。 那么有沒有辦法更好地實施? 有沒有辦法在SI流程中執行批量插入?

謝謝

我寫了提到的自定義出站通道適配器,它使用spring-jdbc批處理能力:

public class ArrayListSqlBatchOBCA {

  private final static Logger           log = LoggerFactory.getLogger(ArrayListSqlBatchOBCA.class);
  private NamedParameterJdbcTemplate    template;
  private String                        sql;

  public void process(Message<? extends ArrayList<?>> message) throws Exception {

    try {
          ArrayList<?> list = (ArrayList<?>) message.getPayload();

          SqlParameterSource[] batchArgs = new SqlParameterSource[list.size()];
          for (int i = 0; i < list.size(); i++) {
              batchArgs[i] = new BeanPropertySqlParameterSource(list.get(i));
          }

          template.batchUpdate(sql, batchArgs);
      }
      catch (Exception e) {
          log.error("Exception while processing message", e);
          throw e;
      }
   }
}

這就是我使用它的方式(XML配置):

  <channel id="cc"/>
  <outbound-channel-adapter channel="cc" method="process">
      <beans:bean class="mypackage.ArrayListSqlBatchOBCA">
          <beans:property name="template" ref="jdbcTemplate"/>
          <beans:property name="sql" 
             value="INSERT INTO test (field1,field2,field3)  
                    VALUES (:f1,:f2,:f3)"/>
  </beans:bean>
  </outbound-channel-adapter>

此外,我將?reWriteBatchedInserts=true添加到我的數據源的jdbc url(我使用postgres JDBC驅動程序)。

有關該選項的文檔

reWriteBatchedInserts - 啟用優化以重寫和折疊已批處理的兼容INSERT語句。 如果啟用,pgjdbc insert into ... values(?, ?)批量重寫insert into ... values(?, ?) insert into ... values(?, ?), (?, ?), ...

這樣,使用一個小的自定義代碼,我從輸入集合一次插入多行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM