所以,我有一些我需要保存的DTO。它们由临时表支持,并且还需要将其数据插入“真实”表中。
我没有时间对这些记录进行正确的批处理,并且预期的结果数量虽然理论上非常高,但可能大约为50或更低。这个应用程序还有其他几个问题(它是一个真正的集群* * ),所以我只是想为测试目的而运行并运行。
我在考虑执行以下的伪代码(在事务中):
PreparedStatement insert1 = con.prepareStatement(...);
PreparedStatement insert2 = con.prepareStatement(...);
for(DTO dto : dtos) {
prepareFirstInsertWithParameters(insert1, dto);
insert1.executeUpdate();
prepareSecondInsertWithParameters(insert2, dto);
insert2.executeUpdate();
}
首先,这将按原样工作 - 我可以在不执行clearParameters()的情况下重用已准备好的语句,还是必须对它们执行close(),或者继续获取更多准备好的语句?
其次,除了批处理之外,还有更高效(更清洁)的方法吗?
答案 0 :(得分:2)
这很简单:
conn = dataSource.getConnection();
conn.setAutoCommit( false );
pStatement = conn.prepareStatement( sqlStr );
ListIterator<DTO> dtoIterator = dtoList.listIterator();
while( dtoIterator.hasNext() ) {
DTO myDTO = dtoIterator.next();
pStatement.setInt( 1, myDTO.getFlibble() );
pStatement.setInt( 2, myDTO.getNuts() );
pStatement.addBatch();
}
int[] recordCount = pStatement.executeBatch();
conn.commit();
答案 1 :(得分:0)
MetroidFan2002,
我不知道你的意思是“除了批处理”,但我假设你的意思是执行一个批处理的SQL语句。但是,您可以批量准备好的语句调用,这样可以通过一次提交多个调用来提高性能:
PreparedStatement insert1 = con.prepareStatement(...);
PreparedStatement insert2 = con.prepareStatement(...);
for(DTO dto : dtos) {
prepareFirstInsertWithParameters(insert1, dto);
prepareSecondInsertWithParameters(insert2, dto);
insert1.addBatch();
insert2.addBatch();
}
insert1.executeBatch();
insert2.executeBatch();
// cleanup
现在,如果您的数据集可能会像您提到的那样变大,那么您需要在每N行数中添加一些逻辑来清空批处理,其中N是一个调整为您的设置的最佳性能的值。 / p>
答案 2 :(得分:0)
JDBC支持批量插入/更新。请参见示例here。