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一次。可是两个循环耗费的时间仍然很长。
在JAVA开发中数据库的学习也是我们需要了解的,截下来几篇文章都是关于数据库的设计和应用,那么java课程培训机构http://www.kmbdqn.cn/废话不多说开始学习吧! 数据库的设计 数据库设计是基础,数据库优化是建立在设计基础之上的。
好的数据库一定拥有好的设计。
数据库设计的目标是为用户和各种应用系统提供一个信息基础设施和高效的运行环境。
数据库的三大范式 第一范式1NF:所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。
第二范式2Nf:第二范式在第一范式的基础之上更进一层。
第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
第三范式3Nf:所有字段必须与主键直接相关,而不是间接相关。
也可以理解为字段不要和其他非主键字段相关. 注意:这三个范式尽可能去遵守,不是一定要墨守成规.这只是让我们设计的表的时候,越靠近这些范式,可以使字段尽量的减小冗余.但是有时候也可以根据实际需要小小的违背一下.但是第三范式违反一下还可以接受,但是第一范式别违反. 数据库设计的步骤 需求分析阶段 准确了解与分析用户需求(包括数据与处理)。
是整个设计过程的基础,是最困难、最耗费时间的一步。
概念结构设计阶段 是整个数据库设计的关键--设计数据库的E-R模型图,确认需求信息的正确和完整 Entity_Relationship---实体之间的关系 一对一 一对多 多对一