JDBC批量操作數據庫數據的內存限制

最近在做移動商城的項目,其中一個模塊是用數據庫表來記錄日誌。

最近有同事反應,他的數據沒記全後半部分給人家丟了。驚恐咱這麼正值的人,怎麼能幹這種事呢,不能夠!!於是,俺自己測了一下果然是丟了大哭同事的數據大約有30幾K,而我纔給人家保留了16K左右的數據。。。。。名譽一下被毀了。委屈於是,決定要把丟失的數據找回來,不能讓他們在外面飄蕩。

這次的項目是移動指定的數據庫sybase,第一次接觸以前從來沒用過,所以有很多方面不是很瞭解。諮詢了sybase的售後支持,人家說我們沒限制。

好吧,既然你們沒限制,那就從我們這裏查找問題吧。項目的結構是spring+ibatis+sybase srping負責注入、ibatis負責數據庫操作,起初以爲是它倆合作出的問題,於是拋開項目,自己寫了一個demo用最原始操作數據庫的方法向表裏寫數據,結果大於16k的數據全部都寫進去了。這樣就證明了sybase本身以及jdbc本身都是沒有問題的。

第二步,添加ibatis再次測試通過,說明ibatis也沒有問題。第三次,spring+ibatis+sybase居然也成功了!!!!看來之前的猜測都錯了,冤枉了衆兄弟。

那麼,問題到底出在哪呢??返回項目查看源碼,原來在操作庫表的時候用到了批次。去掉事處及批次處理的代碼再次測試,問題解決了大笑

readWriteClient.startTransaction();

        try {

            readWriteClient.startBatch();

            Map<String, Object> params = new HashMap<String, Object>();

            for (ProductProp prop : propList) {

                params.put("propertyId", prop.getPropertyId());

                params.put("productId", prop.getProductId());

                params.put("propertyValue", prop.getPropertyValue());

                readWriteClient.update("ProductProp.updatePropertyValue", params);

            }

            readWriteClient.executeBatch();

            readWriteClient.commitTransaction();

        } finally {

            try {

                readWriteClient.endTransaction();

            } catch (Exception e) {

                logger.error("endTransaction exception", e);

            }

        }


總結:

jdbc操作數據庫時,如果使用batch執行insert\update\delete時,字符串String最大長度爲16kb 如果單獨使用insert\update\delete時,沒有該限制。


因爲批理執行的原理,是將待提交的數據先暫時存在內存中,所以jdbc對單次內存做了限制,至於該限制能不能改?我的回答是:不知道尷尬

批次處理,其實就是把要提交的數據拼接成一個大的sql然後一次提交到數據庫,這樣可以保證一次執行全部成功或者全部撤回

發佈了20 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章