当前位置: 代码迷 >> Java Web开发 >> SpringMVC+Hibernate+quartz-all-1.8.6.jar+CXF做大批量数据同步,上10000万条数据,跑着跑着就卡住!解决方法
  详细解决方案

SpringMVC+Hibernate+quartz-all-1.8.6.jar+CXF做大批量数据同步,上10000万条数据,跑着跑着就卡住!解决方法

热度:1120   发布时间:2016-04-13 22:24:21.0
SpringMVC+Hibernate+quartz-all-1.8.6.jar+CXF做大批量数据同步,上10000万条数据,跑着跑着就卡住!!!
本帖最后由 sinat_31191963 于 2015-09-21 17:59:11 编辑
public void saveDining(List<com.daqsoft.webservice.DcDining> list,
IUpDataService upDataService, SynchronizeForm form, Properties props) {
// Session currentSession = this.getEntityDao()
// .getHibernateSessionFactory().getCurrentSession();
Session currentSession = this.getEntityDao().currentSession();
boolean isUpdate = false;
try {
for (int i = 0; i < list.size(); i++) {
com.daqsoft.webservice.DcDining dining = list.get(i);
// for (com.daqsoft.webservice.DcDining dining : list) {
System.out.println("保存或更新DcDinging开始------Start------" + count);
// DcDataSource source = dcDataSourceService.getDataSource(
// dining.getId(), form, dining.getClass());
DcDataSource source = this.showDataSource(dining.getId(), form,
dining.getClass());
System.out.println(count + "-返回DcDataSource结果: " + source);

Long dingId = 1l;
if (source == null) {
isUpdate = false;
try {
DcDining resetDining = this.resetDining(dining);
resetDining.setClustertag(form.getClustertag());
this.save(resetDining);
dingId = resetDining.getId();
this.doSaveDataSource(dining.getId(),
resetDining.getId(),
this.doConvertToDate(dining.getUpdatetime()),
form, resetDining.getClass());
System.out
.println("------------------------------保存DcDining成功!");
} catch (Exception e) {
logger.error("同步新增DcDining出错: ", e);
}
} else {
try {
dingId = source.getDataid();
long time1 = source.getUpdatetime().getTime();
long time2 = this.doConvertToDate(
dining.getUpdatetime()).getTime();
if (time1 != time2) {
isUpdate = true;
source.setUpdatetime(this.doConvertToDate(dining
.getUpdatetime()));
// dcDataSourceService.update(source);
try {
this.doUpdate(source);
// this.doUpdateDataSource(source);
} catch (Exception e) {
logger.error("同步更新DcDataSource出错: ", e);
}
DcDining dcDining = this.showDining(source
.getDataid());
if (null != dcDining) {
DcDining resetDining = this.resetDining(dining);
resetDining.setClustertag(form.getClustertag());
BeanUtils.copyProperties(resetDining, dcDining,
new String[] { "id" });
this.update(dcDining);
System.out
.println("------------------------------更新DcDining成功!");
}
}
} catch (Exception e) {
logger.error("同步更新DcDining出错: ", e);
}
}
if (i % 20 == 0) {
currentSession.flush();
currentSession.clear();
}
System.out.println("保存或更新DcDinging结束------End------" + count);
count++;
}
} catch (Exception e) {
logger.error("同步DcDing错误: ", e);
}
------解决思路----------------------
这种 for 循环下头先搜库再更新库的操作,上万条记录的话,基本上就是在对你的 db 进行压力测试。
以前写过一个 sql 性能测试的程序,基本就是楼主这么干的:http://blog.csdn.net/defonds/article/details/16832081。
所以应该从业务逻辑上避免这种写法。
推荐的写法:
多次查找,然后一次或者几次更新。
这种最好用原生态 sql,自己组织 sql,性能比框架的好。而且对于一般开发者来说,性能还是可见的。

------解决思路----------------------
楼主,你贴这些基本没啥用,除非你的代码里有特别明显的性能问题。
你贴一下卡住时,应用服务器和 db 服务器的性能指标,还能有助于定位问题。
------解决思路----------------------
对数据库进行尽可能少的访问。
  相关解决方案