java--多线程

问题简述:公司项目有一个人员导入功能,此功能是通过EXCEL录入人员信息,然后再系统导入EXCEL,后台会自动解析并存储。
最近生产环境出现几十万人的大数据,这样如果有几个这样几十万的单子导入的话,特别耗系统资源,

解决方案:项目组出了一个方案,客户在点击导入时,如果人数大于1000,将EXCEL存储到NAS路径下,通过另外一个应用去定时执行程序导入人员(使用Spring的quartz定时触发)。

实现步骤:
1、首先需要新增一套表,用于存储业务号及导入清单的存储路径及其他相关信息。
2、使用quartz去定时触发
3、触发一次获取表中10个未被占用业务号。
4、通过这些单号根据条件再次查询此表,并且使用for update锁定所有记录(避免其他线程干扰)。
5、由于使用quartz定时执行,就要考虑到多线程问题,这里我在表中新增一个字段LOCKSTATS,将4查询出的所有数据遍历更新表状态。
6、此service执行结束后,事务会自动提交(事务已经托管给spring),返回到*quartz方法然后再遍历这些数据进行原来的插入操作。

发现问题:
1、今天遇到问题,由于在版本环境quartz设定没30秒执行一次,导致weblogic出现连接数不够的问题。(今天解决方案增加连接数)
2、此功能分块开启多个事务执行(),如果重启服务可能会造成数据问题。

相关代码:
public List<PrpTDExcelInfo> getTDExcelInfo() throws Exception{
		// 一次查询出10条满足条件的数据
		String fitSql = "select distinct a.id.certiNo from PrpTDExcelInfo a where a.status='0' and a.lockStatus='0' and a.dealStartTime is null ";
			   fitSql += " and a.id.certiNo not in  (select distinct b.id.certiNo from PrpTDExcelInfo b where b.lockStatus='1' and b.status='0' ) and rownum < 11";
		List<String> resultList = super.findByHql(fitSql);
		List<PrpTDExcelInfo> excelInfoList = new ArrayList<PrpTDExcelInfo>();
		List<PrpTDExcelInfo> returnList = new ArrayList<PrpTDExcelInfo>();
		String certiNo ="" ;
		//锁定对应的certiNo的记录,使用nowait
		System.out.println("---resultList.size()---:"+resultList.size());
		String lockSQL = "select a from PrpTDExcelInfo a where a.id.certiNo in (:certiNoList) and  a.status='0' and a.lockStatus='0' " +
				" and a.id.certiNo not in  (select distinct b.id.certiNo from PrpTDExcelInfo b where b.lockStatus='1' and b.status='0' ) order by a.id.serialNo ";
		Session session = this.getSession();
		Query query = null;
		try{
			if(resultList.size() > 0){
				query = session.createQuery(lockSQL);
				query.setParameterList("certiNoList", resultList);
				query.setLockMode("a", LockMode.UPGRADE_NOWAIT);
				excelInfoList = query.list();
				if(excelInfoList.size()<1){
					//没有锁住对应的记录
				}else{
					for(PrpTDExcelInfo prpTDExcelInfo : excelInfoList){
						prpTDExcelInfo.setLockStatus("1");
						this.update(prpTDExcelInfo);
						returnList.add(prpTDExcelInfo);
					}
				}
				session.flush();
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return returnList;
	}

你可能感兴趣的:(java)