天天看點

Spring源碼分析——JdbcTemplate執行批量insert操作

最近用到一個方法:

   在Mysql中,是支援批量插入的,文法為inset into 那個表 values+  一堆值;在JdbcTemplate中,提供了友善批量插入的方法。先拼接出基本的sql,然後利用PreparementStatement的addBatch方法,将需要執行sql語句批量插入。

   這段代碼在小資料的測試時候,是沒有問題的。但是當我拿2w條資料測試的時候,速度就慢的讓人難以忍受。so,讓我們重新審視這段代碼。邏輯沒問題,這時候會發現,怎麼代碼裡面沒有事務控制。

    是的,一般我們的事務控制都交給spring統一管理了,比如,特别常見的事務配置,使用DataSourceTransactionManager這個類來切入service方法,進行事務管理,如果這麼玩兒的話,在執行你真正的service方法之前,會先執行下面的方法:

    先關閉手動送出事務,之後所有操作執行完成,再統一送出事務。很不幸,如果你使用了jdbcTemplate批量更新,但是又沒有配置任何事務,就會出現這種情況:你批量插入兩天條資料,代碼寫法上沒有任何問題,你不斷selet count(0) from你的操作表,你會發現,此時,資料是一條一條送出的,也就是說,你此時正在使用的是mySql的預設自動送出事務,2w條資料測試都慢死你,if more。。。。

   但是當你切入了事務,你就節省掉了事務那部分開銷時間,隻送出一次。