在使用jdbctemplate的批量操作的時候調用jdbcTemplate.batchUpdate,他的原理機制是,集合一定數量的sql,一起發送到數據庫,這樣減少與數據庫頻繁交互的成本但現在有一個問題就是,我這有50條sql,批量插入,然后有一條有問題,我如何讓這一條執行失敗時,不影響其余49條語句的執行呢?下面是我自己封裝的一個方法批量插入這個list到數據庫去,如果出現什么值太大,違反唯一性約束什么之類的異常,我的那個catch根本就捕獲不住,我最多只能知道這個list插入有問題,沒法實現list中一條記錄有問題,不影響其他記錄的執行public void insert(final List<?> lists) {// 獲取insert語句 eg:sql = insert into user (id,name,age) values (?,?,?)String sql = SqlUtils.getInsertSql(lists.get(0));jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {@Overridepublic void setValues(PreparedStatement ps, int i) {Object value = lists.get(i);// objects = 獲取代替?的具體值Object[] objects = SqlUtils.getValues(value);for (int k = 0; k < objects.length; k++) {try {ps.setObject(k + 1, objects[k]);} catch (SQLException e) {log.error("數據庫異常 -- "+value.getClass().getSimpleName(),e);}}} @Override
public int getBatchSize() {
return lists.size();
}
});}
3 回答

弒天下
TA貢獻1818條經驗 獲得超8個贊
如果想批量,就要一起commit,一起回滾事物,
否則如果你想記錄記錄哪條數據有問題,
那就不要批量,一條一條提交,
碰到有問題的trycatch去捕獲他,
定義一個字符串記錄一下,然后再繼續提交,
如果再次碰到有問題的,然后在追加字符串,
最終返回字符串,
如果是空的,代表全部成功,
否則就查詢字符串里面記錄的信息,就知道哪條失敗了

呼如林
TA貢獻1798條經驗 獲得超3個贊
批量么,肯定是要么全commit,要么全rollback。
你既然用了batchUpdate,batchInsert,那你肯定得確保你的批量sql都沒有問題。
神馬主鍵約束啊,你設計的數據庫不會考慮到這些問題么,如果不用主鍵自增長,那你頁面表單就得ajax判斷數據庫是不是已經存在了!
長度神馬的都是客戶端上該處理的問題,你這些驗證控制自己不做好,數據庫再牛板也幫不了你啊
添加回答
舉報
0/150
提交
取消