关于接口并发问题,webservice,等http请求

博客探讨了一个在不使用高并发解决方案如MQ或Redis的情况下,如何处理外部系统重复调用Java WebService接口导致的数据重复问题。通过在`insert`方法中使用`synchronized`关键字确保线程安全,避免数据脏读。然而,同步操作可能降低性能,需要在并发性能和数据一致性之间权衡。博客还提示可以尝试改变同步对象标识来观察不同效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

暂且不谈高并发 只谈并发  .

不想丢请求再去考虑高并发 MQ或redis的事(这里不考虑)

正题.记录自我需求处理并的情况.

公司的一个框架(一种商业框架很庞大)无法使用整合市面上那些较新的技术框架,只能使用基础的java工具

这里的接口是一个模块 是webservice的

外部系统调用这个接口 重复写入 数据出现重复单据.故对此问题进行解决.

分析:

1.外部系统短时多次提交重复数据 

2.接口系统业务复杂 处理数据用时过长,导致数据积压 .数据脏读.

/**
 * 产成品入库单
 * @author Administrator
 *
 */
public class GetIcFinprodin {
	
	
	private static final Integer JP = 127;//同步对象标识

	public String getExecute(String operation,String orderform){
		String resultstr=null; 
		if (operation.equals("Insert")){
			//插入
			resultstr = insert(operation, orderform);
			
		}
		
		return resultstr;
	}
	
	/**
	 * 插入 
	 * @param operation
	 * @param orderform
	 * @return
	 */
	public String insert(String operation,String orderform){
		


		Boolean flag = true;//默认通过
		
		
		synchronized(JP) {
			
			//通过mes单据号查询单据是否存在 不存在就可以插入否则返回已插入提示
			if(StringUtils.isNotBlank(vdef1) ){
				try {
					BaseDAO bd = new BaseDAO();
					String vbillcodeExist = (String)bd.executeQuery("select vbillcode from ic_finprodin_h where vdef1 = '"+vdef1+"'", new ColumnProcessor());
					if(StringUtils.isNotBlank(vbillcodeExist)){
						flag = false;//已存在不允许重复插入
					}
				} catch (DAOException e) {
					e.printStackTrace();
				}
			}
			
		
		
			if(flag){
                //业务===========....耗时代码段   S
				GetXChangeService gtxchangeservice=new GetXChangeService();
				
				Object ovbillcode = "";
				
				JSONObject backinfojson=gtxchangeservice.getXChangeservice(xml_sb.toString());
				if(backinfojson.getString("$successful").equals("Y")){
					String pk=backinfojson.getJSONObject("sendresult").getString("content");
					BaseDAO bd = new BaseDAO();
					try {
						//获取插入的订单单号  
						ovbillcode = bd.executeQuery("select vbillcode from ic_finprodin_h where cgeneralhid ='"+pk+"'", new ColumnProcessor());
						
						backinfojson.put("$vbillcode", ovbillcode);
					} catch (Exception e) {
						e.printStackTrace();
					}
				//业务.-===========...耗时代码段    E	
					
				}else if(backinfojson.getString("$successful").equals("N")) {
					backinfojson.put("$vbillcode",ovbillcode);
					
				}
				
				return backinfojson.toJSONString();
			}else{
				JSONObject backinfojson = new JSONObject();
				backinfojson.put("$successful", "Y");
				backinfojson.put("sendresult", vdef1+" MES单据已存在,单据已插入成功!");
				return backinfojson.toJSONString();
			}	
		}
	}
	
   
}

JP 标识使用  基本类型 或String 类型(注意不能new  这里是java基础的东西,可了解一下 )  作为同一对象   保证线程同步 有兴趣的可以把 127 改成128 试试效果 估计你能找到答案

同步之后性能会下降,做个取舍吧.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值