最近在做移動商城的項目,其中一個模塊是用數據庫表來記錄日誌。
最近有同事反應,他的數據沒記全後半部分給人家丟了。咱這麼正值的人,怎麼能幹這種事呢,不能夠!!於是,俺自己測了一下果然是丟了同事的數據大約有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時,沒有該限制。