【发布时间】:2012-02-06 16:04:10
【问题描述】:
假设您在数据库中大约有大量数据。 〜100Mb。我们需要以某种方式处理所有数据(更新或导出到其他地方)。如何以良好的性能执行此任务?如何设置交易传播?
示例 1#(性能不佳):
@Singleton
public ServiceBean {
procesAllData(){
List<Entity> entityList = dao.findAll();
for(...){
process(entity);
}
}
private void process(Entity ent){
//data processing
//saves data back (UPDATE operation) or exports to somewhere else (just READs from DB)
}
}
这里有什么可以改进的?
在我看来:
- 我会设置休眠批处理大小(请参阅休眠文档以了解批处理)。
- 我会将 ServiceBean 分成两个具有不同事务设置的 Spring bean。方法 processAllData() 应该用完事务,因为它处理大量数据并且潜在的回滚不会“快速”(我猜)。方法流程(实体实体)将在事务中运行 - 在一个数据实体的情况下进行回滚没什么大不了的。
你同意吗?有什么建议吗?
【问题讨论】:
-
当你说“表现不佳”时,这是一个真实的程序,还是只是猜测?
-
@Skaffman :它的真正程序,我只是将我们的实现抽象到上面的示例中。 1)当操作超过事务到期时间时,会自动回滚-> that
s bad, batch never completes. So thats 为什么我认为不需要该事务。 2) 我们不需要 Oracle 中的大量重做日志。
标签: spring hibernate transactions batch-processing large-data