spring+ibatis 批处理

记录解决过程:
public void batchInsert(final ConcurrentHashMap<String, SpiderUrl> urls) {
getSqlMapClientTemplate().execute(new SqlMapClientCallback() {

@Override
public Object doInSqlMapClient(SqlMapExecutor sqlmapexecutor)
throws SQLException {
// TODO Auto-generated method stub
sqlmapexecutor.startBatch();
int i = 0;
Set<String> keys = urls.keySet();
for (String url : keys) {
SpiderUrl spiderUrl = urls.get(url);
// System.out.println("insert:" + spiderUrl);
sqlmapexecutor.insert("url.insert", spiderUrl);
i++;
if (i == 2000) {
sqlmapexecutor.executeBatch();
i = 0;

}
}
sqlmapexecutor.executeBatch();
return null;
}

});
}
最重要一点:
[b]datasource配置中增加一行:<property name="defaultAutoCommit" value="false"/>[/b]
但是这样处理,所有的其它非批处理操作均不能插入数据。所以改用下面的方式
public void batchInsert(final ConcurrentHashMap<String, SpiderUrl> urls) {
SqlMapClient client = getSqlMapClient();
Connection con=null;
boolean autoCommit=false;
try {
con = client.getDataSource().getConnection();
autoCommit=con.getAutoCommit();
con.setAutoCommit(false);
client.setUserConnection(con);
client.startBatch();
int i = 0;
Set<String> keys = urls.keySet();
for (String url : keys) {
SpiderUrl spiderUrl = urls.get(url);
// System.out.println("insert:" + spiderUrl);
client.insert("url.insert", spiderUrl);
i++;
if (i == 2000) {
client.executeBatch();
i = 0;

}
}
client.executeBatch();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
con.setAutoCommit(autoCommit);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
[b]datasource配置中增加一行:<property name="defaultAutoCommit" value="true"/>[/b]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值