解决useEffect调接口重复请求的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决useEffect调接口重复请求的问题相关的知识,希望对你有一定的参考价值。
参考技术A useEffect的执行机制,是比较两次依赖项是否相同,不同则执行相关effect。思路1: 查看父组建有没有多次UseState,每useSTate一次,子组件就会render一次,导致多次执行useEffect调接口
思路2: useEffect 的依赖项有多个的时候,尽量简洁 。某些执行效果一样的依赖项目就保留一个。
如果想先调父组件数据,再调子组件数据,可以把父组件的请求结果数据,作为子组件的依赖项。
useLayoutEffect的执行顺序是同步,useEffect是异步的。useLayoutEffect会优先于useEffect执行。
关于接口并发问题,webservice,等http请求
暂且不谈高并发 只谈并发 .
不想丢请求再去考虑高并发 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 试试效果 估计你能找到答案
同步之后性能会下降,做个取舍吧.
以上是关于解决useEffect调接口重复请求的问题的主要内容,如果未能解决你的问题,请参考以下文章
在异步函数中正确使用 useEffect 和 useState [重复]