Spring JDBC - 批处理DELETE和INSERT

时间:2013-10-04 13:29:19

标签: java jdbc spring-jdbc jdbctemplate

在我的应用程序中,我有一个包含大约200K记录的表,我需要在数据库中更新。如果DB中存在匹配的记录,然后插入或更新,我认为更快的方法是删除DB中的所有匹配记录并插入它们,而不是检查每条记录。我正在使用Spring JDBC框架。 要删除,我使用了Jdbctemplate batchUpdate方法和ParameterizedPreparedStatementSetter,对于插入,我使用的是SimplJdbcInsert。 插入工作正常,但批量删除性能非常慢。 我不太确定我应采取什么其他方法删除数据库中的记录并插入它们。任何建议都会非常有帮助。我正在使用SQL Server 2008 R2

ParameterizedPreparedStatementSetter<Order> vSetter = 
            new ParameterizedPreparedStatementSetter<Order>() {
                @Override
                public void setValues(PreparedStatement ps,
                        Order order) throws SQLException {
                    ps.setInt(1, order.getOrderNum());
                }
    };

getJdbcTemplate().batchUpdate("DELETE FROM Order WHERE OrderNum = ?",
            aDemandOrders,
            50000,
            vSetter);

1 个答案:

答案 0 :(得分:1)

性能低下的原因是数据库将收到批量语句但仍然逐个执行。

另一种方法是使用for i in {1..1000}; do ./PHASE test$i.inp test$i.out & done 子句并手动批处理语句,以允许DB对每个批处理大小执行一个语句。

仍然可以获得查询缓存的好处,但是您不能简单地在一个#!/bin/bash # Number of cores and range end n=4 e=1000 # This function will do the processing process() { for ((i=$1; i <= $3; i += $2)); do ./PHASE test${i}.inp test${i}.out echo "Done $i" done } # For each core create a process and record the pid for ((i=1; i <= n; i++)); do process $i $n $e & done # Wait for each process to complete wait 子句中发送所有内容,而应该对它们进行适当的批处理。

List[Byte]