我应该如何重用预处理语句来在Java中执行多个插入?

时间:2011-08-11 14:09:00

标签: java prepared-statement

所以,我有一些我需要保存的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(),或者继续获取更多准备好的语句?

其次,除了批处理之外,还有更高效(更清洁)的方法吗?

3 个答案:

答案 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