java – Spring jdbcTemaplate如何一次性将完整的批量大小发送到
发布时间:2020-12-14 14:26:16 所属栏目:Java 来源:网络整理
导读:虽然jdbcTemplate.batchUpdate(…)正在运行我可以看到db行计数逐渐增加(通过在表中运行count(*)),最初是2k然后3k并且直到10k. 2k和3k不是精确的数字有时我得到2357然后4567. 我期待10 k行(批量大小)一次性提交.在我的理解,如果最初我得到行计数0,那么下一行
虽然jdbcTemplate.batchUpdate(…)正在运行我可以看到db行计数逐渐增加(通过在表中运行count(*)),最初是2k然后3k并且直到10k. 2k和3k不是精确的数字有时我得到2357然后4567.
我期待10 k行(批量大小)一次性提交.在我的理解,如果最初我得到行计数0,那么下一行计数应该是10k. 我想要发送数据(10k行)到DB服务器只有一次我的批量大小.为什么我应该在配置中指定什么? 下面是我编写jdbcTemplate批处理更新的方式.批量大小是10k. public void insertRows(...) { ... jdbcTemplate.batchUpdate(query,new BatchPreparedStatementSetter(){ @Override public void setValues(PreparedStatement ps,int i) throws SQLException { ... } @Override public int getBatchSize() { if(data == null){ return 0; } return data.size(); } }); } 编辑:添加@Transactional到isertRows方法stiil我可以看到相同的行为. 我正在使用DataSource实现com.ibm.db2.jcc.DB2BaseDataSource 解决方法
下面的方法怎么样?在你的情况下指定nUpdates = 10,000.我没有尝试测试这个.如果不行,我忽略我的答案.
// the batch size is set in the BatchPreparedStatementSetter,the number of rows we want to process is equal to the nbUpdates parameter public int[] batchUpdate(String sql,final long nbUpdates,final BatchPreparedStatementSetter pss) throws DataAccessException { if (logger.isDebugEnabled()) { logger.debug("Executing SQL batch update [" + sql + "]"); } return (int[]) execute(sql,new PreparedStatementCallback() { public Object doInPreparedStatement(PreparedStatement ps) throws SQLException { try { int batchSize = pss.getBatchSize(); InterruptibleBatchPreparedStatementSetter ipss = (pss instanceof InterruptibleBatchPreparedStatementSetter ? (InterruptibleBatchPreparedStatementSetter) pss : null); if (JdbcUtils.supportsBatchUpdates(ps.getConnection())) { List<Integer> rowsAffected = new ArrayList<Integer>(); for (int i = 1; i <= nbUpdates; i++) { pss.setValues(ps,i - 1); if (ipss != null && ipss.isBatchExhausted(i - 1)) { if (logger.isDebugEnabled()) { int batchIdx = (i % batchSize == 0) ? i / batchSize : (i / batchSize) + 1; logger.debug("Batch exhausted - Sending last SQL batch update #" + batchIdx); } int[] res = ps.executeBatch(); for (int j = 0; j < res.length; j++) { rowsAffected.add(res[j]); } break; } ps.addBatch(); if (i % batchSize == 0 || i == nbUpdates) { if (logger.isDebugEnabled()) { int batchIdx = (i % batchSize == 0) ? i / batchSize : (i / batchSize) + 1; logger.debug("Sending SQL batch update #" + batchIdx); } int[] res = ps.executeBatch(); for (int j = 0; j < res.length; j++) { rowsAffected.add(res[j]); } } } int[] result = new int[rowsAffected.size()]; for (int i = 0; i < result.length; i++) { result[i] = rowsAffected.get(i).intValue(); } return result; } else { List<Integer> rowsAffected = new ArrayList<Integer>(); for (int i = 0; i < nbUpdates; i++) { pss.setValues(ps,i); if (ipss != null && ipss.isBatchExhausted(i)) { break; } rowsAffected.add(ps.executeUpdate()); } int[] rowsAffectedArray = new int[rowsAffected.size()]; for (int i = 0; i < rowsAffectedArray.length; i++) { rowsAffectedArray[i] = rowsAffected.get(i); } return rowsAffectedArray; } } finally { if (pss instanceof ParameterDisposer) { ((ParameterDisposer) pss).cleanupParameters(); } } } }); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |