问题简述:公司项目有一个人员导入功能,此功能是通过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--多线程】课程主要探讨了Java编程中多线程的相关概念和技术,这是在计算机科学中处理并发执行的重要部分。多线程允许在单一程序中同时执行多个任务,提高了程序的效率和响应性。 1. **多线程基本概念**...
在Java编程中,多线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而提高了系统的效率和响应性。然而,在某些场景下,我们可能需要控制线程的执行顺序,确保它们按照特定的顺序交替运行,这在并发编程...
多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!
在多线程环境中,如果某个线程长时间处于忙碌状态,可能会导致性能问题或者阻塞其他线程。通过运行这个脚本,我们可以获取到线程堆栈信息,分析哪些线程正在执行关键操作,或者是否存在死锁现象。这对于优化Java应用...
- **负载均衡**:在多线程服务器应用中,可以根据核心的负载情况动态调整线程绑定,确保资源的均匀分配。 - **减少竞态条件**:在某些同步问题上,绑定线程到特定核心可以降低竞争同一资源的概率,有助于减少竞态...
Java 多线程-Socket 编程 Java 多线程-Socket 编程是指在 Java 语言中使用多线程技术来实现网络编程,特别是使用 Socket 编程来实现客户端和服务器端的通信。在 Java 中,多线程可以使用 Thread 类和 Runnable 接口...
Java多线程允许程序同时执行多个任务,这极大地提高了程序的效率和响应性。在Java中,线程可以分为两类:用户线程和守护线程。用户线程是应用程序的主要执行单元,而守护线程则服务于用户线程,如垃圾收集器就是典型...
java-多线程 test
Java-JUC-多线程进阶 Java-JUC-多线程进阶resources是 Java 并发编程的高级课程,涵盖了 Java 中的并发编程概念、线程安全、锁机制、集合类、线程池、函数式接口、Stream流式计算等多个方面。 什么是JUC JUC...
Java-JSP计算机毕业设计课程设计项目源码 Java-JSP计算机毕业设计课程设计项目源码 Java-JSP计算机毕业设计课程设计项目源码 Java-JSP计算机毕业设计课程设计项目源码 Java-JSP计算机毕业设计课程设计项目源码 Java-...
14.java-多线程
Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-...
练习GUI编程和多线程,包括多线程的睡眠、唤醒,界面的简单编程,实现字幕滚动的功能
基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip ...
基于Http协议的断点续传-Java多线程与线程安全实践编程.zip 基于Http协议的断点续传-Java多线程与线程安全实践编程.zip 基于Http协议的断点续传-Java多线程与线程安全实践编程.zip 基于Http协议的断点续传-Java多...
- 以上介绍了Java多线程的基本概念、创建方式、常用方法以及同步机制等内容。这些知识点对于理解和掌握Java多线程编程至关重要。通过这些基础知识的学习,可以更好地应用多线程技术解决实际问题,提高程序的性能和...
javaweb毕业设计-Java多线程与线程安全实践-基于Http协议的断点续传(可做课程设计).rarjavaweb毕业设计-Java多线程与线程安全实践-基于Http协议的断点续传(可做课程设计).rarjavaweb毕业设计-Java多线程与线程安全...
【标题】基于tesseract的多线程OCR服务器的JAVA实现 在信息技术领域,光学字符识别(OCR)技术被广泛应用于将图像中的文本转换为可编辑的电子格式。Tesseract是一款开源OCR引擎,由Google维护,它具有高精度和强大...
Java开发案例-springboot-61-整合asyncTool京东多线程编排工具-源代码+文档.rar Java开发案例-springboot-61-整合asyncTool京东多线程编排工具-源代码+文档.rar Java开发案例-springboot-61-整合asyncTool京东多线程...