Java批量数据库操作,如何性能优化
1个回答
2016-11-24 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
关注
展开全部
List<Student> list = new ArrayList<Student>();
for(int i=0;i<list.size();i++){
Student st = (Student)list.get(i);
Object o = getHibernateTemplate().get(Student.class, st.getStudentId());
if(null == o){
...
Address addr = new Address();
...
getHibernateTemplate().saveOrUpdate(addr);
getHibernateTemplate().saveOrUpdate(o);
getSession().flush();
getSession().evict(addr);
getSession().evict(o);
} else {
...
Address addr = methodForFindAddr(o);
...
getHibernateTemplate().saveOrUpdate(hql);
getHibernateTemplate().saveOrUpdate(o);
getSession().flush();
getSession().evict(addr);
getSession().evict(o);
}
}
现在实现如上面代码所示,如果list数据量比较小的话,还可勉强凑合,若超过数万条数据,需耗费大量时间,有什么好的建议对此进行优化?
我曾试两种方法:1.过线程池的方式,可方法methodForFindAddr可能会出现同步问题,线程之间数据串了。
2.将所有saveOrUpdate的对象抽取出来,循环批量保存,每循环50次,flush一次。可是两个循环耗费的时间仍然很长。
for(int i=0;i<list.size();i++){
Student st = (Student)list.get(i);
Object o = getHibernateTemplate().get(Student.class, st.getStudentId());
if(null == o){
...
Address addr = new Address();
...
getHibernateTemplate().saveOrUpdate(addr);
getHibernateTemplate().saveOrUpdate(o);
getSession().flush();
getSession().evict(addr);
getSession().evict(o);
} else {
...
Address addr = methodForFindAddr(o);
...
getHibernateTemplate().saveOrUpdate(hql);
getHibernateTemplate().saveOrUpdate(o);
getSession().flush();
getSession().evict(addr);
getSession().evict(o);
}
}
现在实现如上面代码所示,如果list数据量比较小的话,还可勉强凑合,若超过数万条数据,需耗费大量时间,有什么好的建议对此进行优化?
我曾试两种方法:1.过线程池的方式,可方法methodForFindAddr可能会出现同步问题,线程之间数据串了。
2.将所有saveOrUpdate的对象抽取出来,循环批量保存,每循环50次,flush一次。可是两个循环耗费的时间仍然很长。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询