for(int i=0i<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一次。可是两个循环耗费的时间仍然很长。
1、在java中,高并发属于一种编程术语,意思就是有很多用户在访问,导致系统数据不正确、糗事数据的现象。并发就是可以使用多个线程或进程,同时处理不同的 *** 作。2、处理高并发的方法对于一些大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。
(1)动静分离。静态资源请求与动态请求分离,项目中需要访问的图片、声音、js/css等静态资源需要有独立的存放位置,便于将来实现静态请求分离时直接剥离出来,比如nginx可以直接配置图片文件直接访问目录,而不需要经过tomcat。这样tomcat就可以专注处理动态请求, *** 作数据库数据处理之类的。静态请求代理服务器性能比tomcat高很多。
(2)引入缓存。数据库缓存、页面缓存,这东西好用不复杂,搞明白什么地方适用最重要。简单的例子是频繁读取,不修改的地方最适用。也是后续集群做数据共享的一个方式之一,集群环境下,经常会碰到数据共享问题。
(3)如果将来数据量大,单一数据库成为瓶颈时,数据库的读写分离来了。数据库集群,读写分离,分表分区。
批量处理每10000条(根据机器内存情况调整)循环一次
使用hibernate的session对10000条数据进行循环,每50条刷新一次
配置hibernate sql批量提交的条目数,设置成50
我数据库用的是db2,10万条效率还算可以
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)