alancxx

          ------簡單就是美

          oracle jdbc 邪惡數字"65536" ---批量插入10萬條記錄引發的“血案”

          1.   故事背景:

          mysql數據遷移到oracle,其中有個表名叫“bil_vip”,有10萬條記錄,遷移后檢查發現oracle數據庫只插入34464條記錄,程序執行過程沒有發現任何錯誤。修改數據庫連接代碼向mysql插入10萬條記錄,結果都插入OK。

          批量插入使用spring jdbctemplate.batchUpdate(sql, new BatchPreparedStatementSetter());方法,該方法的核心是PreparedStatement的executeBatch方法。

          2.   繼續實驗:

          新建一個Test表,只有一個name字段做實驗。

          拋棄jdbctemplate,直接使用PreparedStatement做實驗,結果和jdbcTemplate是一樣的,實驗證明總是會丟失65536條記錄。

          oracle 驅動的問題?換了最新driver,還是不行。繼續探索....

          3.   希望之光:

          早上發了個消息向大家征求思路,繼中說了一句分批處理,點亮了我的思路。按照繼中提供思路,每1萬條記錄一批,分多批發送給Oracle。

          結果喜出望外,10萬條記錄全部插入成功。但是"65536"這個數字是什么意思呢......     

          在網上搜索文章發現,這個65536是一個bug。當PreparedStatement批量處理正好65536個記錄時候,程序會掛死。我試了一下真的掛死了,太嚇人了,這坑夠深的。

          4.   解決方案:

          spring jdbctemplate還是很好用的,而且業務已經被我封裝了,如果使用PreparedStatement意味著多了一個處理分支,以后維護會很麻煩。

          我新建一個MyJdbcTemplate類,繼承 jdbctemplate類,并覆蓋了batchUpdate方法。這下舒服了,系統又恢復了整潔。      

          5.   ★ 結論和收獲:

          ü  有事多思考,多請教身邊同事。

          ü  堅持Open-close原則(Open for extension, Closed for modification)會系統更好的擴展,非常容易維護,關鍵是要堅持這個原則,如果我因為一個特殊分支使用了PreparedStatement,這樣勢必破壞了這個原則,日后的維護必然會很麻煩。

          ü  基于oracle數據如果使用jdbc批量,一定要分批發送數據oracle,否則正好發一個65536系統就掛死,大于65536數據就丟失,杯具呀......

          6.   題目何以為“血案”:

          周二打球回家就想這個問題,打開筆記本調試,不知不覺搞到很晚,影響媳婦睡覺(媳婦早上5:30上班),被痛罵一頓,趕緊上床睡覺,我媳婦氣的不行,手痛砸了一下床板(我們的床撤掉了床墊,只有床架和木板),床一下子塌了,把媳婦嚇壞了,把我腿弄傷了一塊,唉,“血案”呀。

          posted on 2012-01-31 20:17 蜂鳥 閱讀(1456) 評論(1)  編輯  收藏 所屬分類: j2ee架構

          評論

          # re: oracle jdbc 邪惡數字"65536" ---批量插入10萬條記錄引發的“血案” 2013-02-21 13:02 日出星辰

          文筆很不錯!
          能把覆蓋batchUpdate方法那段代碼展示一下嗎?我被這個問題折磨了好長時間了  回復  更多評論   

          公告

           掌握了XML就掌握了未來!

          導航

          <2025年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          統計

          常用鏈接

          留言簿

          隨筆檔案(1)

          文章分類(17)

          文章檔案(17)

          搜索

          最新評論

          主站蜘蛛池模板: 长岛县| 大邑县| 大洼县| 上高县| 黎川县| 吉木乃县| 万宁市| 建昌县| 夏邑县| 措勤县| 哈密市| 石景山区| 双峰县| 桑日县| 东城区| 永年县| 家居| 墨竹工卡县| 江达县| 黑山县| 静海县| 六枝特区| 固原市| 九龙坡区| 孝昌县| 曲沃县| 陇南市| 咸丰县| 井陉县| 罗山县| 天峻县| 南靖县| 玛纳斯县| 灌云县| 合江县| 巩留县| 长治市| 当涂县| 神农架林区| 临潭县| 和政县|