想象一下,你在数据库中有大量的数据。 〜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)
}
}
这里有什么可以改进的?
在我看来:
答案 0 :(得分:2)
以下是两个基本策略:
hibernate.jdbc.batch_size
)。如果要混合和匹配对象C / U / D操作,请确保已配置Hibernate以订购插入和更新,否则不会批处理(hibernate.order_inserts
和hibernate.order_updates
)。在进行批处理时,必须确保clear()
Session
Work
,以便在大型事务中不会遇到内存问题。doWork
接口并使用您的实现类(或匿名内部类)来针对JDBC连接运行本机SQL。通过分号连接手工编码的SQL(适用于大多数DB),然后通过{{1}}处理该SQL。此策略允许您使用Hibernate事务协调器,同时能够充分利用本机SQL的强大功能。您通常会发现无论您获得OO代码的速度有多快,使用连接SQL语句等DB技巧都会更快。
答案 1 :(得分:1)