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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值