splitDatas.addAll(failedDatas); // 下次重试时,只处理错误的记录
} else {
failedDatas.addAll(splitDatas); // 先添加为出错记录,可能获取lob,datasource会出错
}
final LobCreator lobCreator = dbDialect.getLobHandler().getLobCreator();
if (useBatch && canBatch) {
// 处理batch
final String sql = splitDatas.get(0).getSql();
int[] affects = new int[splitDatas.size()];
affects = (int[]) dbDialect.getTransactionTemplate().execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
// 初始化一下内容
try {
failedDatas.clear(); // 先清理
processedDatas.clear();
interceptor.transactionBegin(context, splitDatas, dbDialect);
JdbcTemplate template = dbDialect.getJdbcTemplate();
int[] affects = template.batchUpdate(sql, new BatchPreparedStatementSetter() {
public void setValues(PreparedStatement ps, int idx) throws SQLException {
doPreparedStatement(ps, dbDialect, lobCreator, splitDatas.get(idx));
}
public int getBatchSize() {
return splitDatas.size();
}
});
interceptor.transactionEnd(context, splitDatas, dbDialect);
return affects;
} finally {
lobCreator.close();
}
}
});
// 更新统计信息
for (int i = 0; i < splitDatas.size(); i++) {
processStat(splitDatas.get(i), affects[i], true);
}
} else {
final EventData data = splitDatas.get(0);// 直接取第一条
int affect = 0;
affect = (Integer) dbDialect.getTransactionTemplate().execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
try {
failedDatas.clear(); // 先清理
processedDatas.clear();
interceptor.transactionBegin(context, Arrays.asList(data), dbDialect);
JdbcTemplate template = dbDialect.getJdbcTemplate();
int affect = template.update(data.getSql(), new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
doPreparedStatement(ps, dbDialect, lobCreator, data);
}
});
interceptor.transactionEnd(context, Arrays.asList(data), dbDialect);
return affect;
} finally {
lobCreator.close();
}
}
});
// 更新统计信息
processStat(data, affect, false);