`
gpqhl0071
  • 浏览: 54719 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

java--多线程

    博客分类:
  • 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--多线程

    【北大Java--多线程】课程主要探讨了Java编程中多线程的相关概念和技术,这是在计算机科学中处理并发执行的重要部分。多线程允许在单一程序中同时执行多个任务,提高了程序的效率和响应性。 1. **多线程基本概念**...

    JAVA线程高级-线程按序交替执行

    在Java编程中,多线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而提高了系统的效率和响应性。然而,在某些场景下,我们可能需要控制线程的执行顺序,确保它们按照特定的顺序交替运行,这在并发编程...

    java多线程同步问题

    多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!

    linux实用脚本show-busy-java-threads

    在多线程环境中,如果某个线程长时间处于忙碌状态,可能会导致性能问题或者阻塞其他线程。通过运行这个脚本,我们可以获取到线程堆栈信息,分析哪些线程正在执行关键操作,或者是否存在死锁现象。这对于优化Java应用...

    Java-Thread-Affinity,将Java线程绑定到给定的内核.zip

    - **负载均衡**:在多线程服务器应用中,可以根据核心的负载情况动态调整线程绑定,确保资源的均匀分配。 - **减少竞态条件**:在某些同步问题上,绑定线程到特定核心可以降低竞争同一资源的概率,有助于减少竞态...

    Java多线程-Socket编程

    Java 多线程-Socket 编程 Java 多线程-Socket 编程是指在 Java 语言中使用多线程技术来实现网络编程,特别是使用 Socket 编程来实现客户端和服务器端的通信。在 Java 中,多线程可以使用 Thread 类和 Runnable 接口...

    JAVA-JavaThreadProgramming-Sams.zip_JAVA 设计_java 多线程_java 线程_多线程

    Java多线程允许程序同时执行多个任务,这极大地提高了程序的效率和响应性。在Java中,线程可以分为两类:用户线程和守护线程。用户线程是应用程序的主要执行单元,而守护线程则服务于用户线程,如垃圾收集器就是典型...

    java-多线程 test

    java-多线程 test

    Java-JUC-多线程 进阶

    Java-JUC-多线程进阶 Java-JUC-多线程进阶resources是 Java 并发编程的高级课程,涵盖了 Java 中的并发编程概念、线程安全、锁机制、集合类、线程池、函数式接口、Stream流式计算等多个方面。 什么是JUC JUC...

    Java毕业课程设计-Java多线程与线程安全实践-基于Http协议的断点续传.zip

    Java-JSP计算机毕业设计课程设计项目源码 Java-JSP计算机毕业设计课程设计项目源码 Java-JSP计算机毕业设计课程设计项目源码 Java-JSP计算机毕业设计课程设计项目源码 Java-JSP计算机毕业设计课程设计项目源码 Java-...

    14.java-多线程.md

    14.java-多线程

    Java多线程编程总结

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-...

    java----GUI线程

    练习GUI编程和多线程,包括多线程的睡眠、唤醒,界面的简单编程,实现字幕滚动的功能

    基于java的开发源码-多线程程序死锁检查 JCarder.zip

    基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip ...

    基于Http协议的断点续传-Java多线程与线程安全实践编程.zip

    基于Http协议的断点续传-Java多线程与线程安全实践编程.zip 基于Http协议的断点续传-Java多线程与线程安全实践编程.zip 基于Http协议的断点续传-Java多线程与线程安全实践编程.zip 基于Http协议的断点续传-Java多...

    JAVA-基础多线程

    - 以上介绍了Java多线程的基本概念、创建方式、常用方法以及同步机制等内容。这些知识点对于理解和掌握Java多线程编程至关重要。通过这些基础知识的学习,可以更好地应用多线程技术解决实际问题,提高程序的性能和...

    javaweb毕业设计-Java多线程与线程安全实践-基于Http协议的断点续传(可做课程设计).rar

    javaweb毕业设计-Java多线程与线程安全实践-基于Http协议的断点续传(可做课程设计).rarjavaweb毕业设计-Java多线程与线程安全实践-基于Http协议的断点续传(可做课程设计).rarjavaweb毕业设计-Java多线程与线程安全...

    基于tesseract的多线程OCR服务器的JAVA实现

    【标题】基于tesseract的多线程OCR服务器的JAVA实现 在信息技术领域,光学字符识别(OCR)技术被广泛应用于将图像中的文本转换为可编辑的电子格式。Tesseract是一款开源OCR引擎,由Google维护,它具有高精度和强大...

    Java开发案例-springboot-61-整合asyncTool京东多线程编排工具-源代码+文档.rar

    Java开发案例-springboot-61-整合asyncTool京东多线程编排工具-源代码+文档.rar Java开发案例-springboot-61-整合asyncTool京东多线程编排工具-源代码+文档.rar Java开发案例-springboot-61-整合asyncTool京东多线程...

Global site tag (gtag.js) - Google Analytics