Java批量数据库 *** 作,如何性能优化

Java批量数据库 *** 作,如何性能优化,第1张

List<Student>list = new ArrayList<Student>()

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万条效率还算可以


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6471957.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-23
下一篇 2023-03-23

发表评论

登录后才能评论

评论列表(0条)

保存