求教并发问题

就是做了一个评教功能,当超过两百个人一起提交评教结果的时候会丢失一部分数据,这个功能是在一个controller执行的很多条sql语句,请问怎么解决?

评论区

JFinal

2020-05-27 15:11

这个没有提供代码,是无论如何也猜不到发生了什么的

liubo187

2020-05-27 16:42

@JFinal 代码有点多。。。贴上来了,就是前端页面点击一个提交按钮就传数据过来,然后下面这个方法去执行,现在问题就是当前端页面有很多人一起点击提交数据执行下面这个方法的时候会有些人的提交数据没有保存。想问下有没有什么办法出来这种并发问题。

public void savexspj() {
try {
float df=0F;
String pjcs = getPara("pjcs");
String [] jxpjxDm=getPara("gpjxDm").split(",");
String text1 = getPara("text1");
String text2 = getPara("text2");
// System.out.println(text1);

String rydm = getPara("rydm");
String cprylbdm = getPara("cprylbdm");
String [] pddjdm = getPara("pddjdm").split(",");

Date date = new Date();
DateFormat df2 = DateFormat.getDateTimeInstance();//可以精确到时分秒
Record xl =Db.use("szxy").findFirst("select * from t_dm_gy_xl where zf_bj='0' and KS_SJ<'"+df2.format(date)+"' and JS_SJ>'"+df2.format(date)+"'");

Record ry = (Record)getSession().getAttribute("CurUser");
Record list1=Db.use("szxy").findFirst("select * from t_pj_jxpjx where zf_bj='0' and JXPJX_DM='"+jxpjxDm[0]+"'");
for(int i=0;i Record r = Db.use("szxy").findFirst("select * from t_pj_gpjzb where zf_bj=0 and XL_DM='"+xl.getStr("XL_DM")+"' and JXPJX_DM='"+jxpjxDm[i]+"' and RY_DM='"+rydm+"' and LRR='"+ry.getStr("RY_DM")+"' and CPRYLB_DM='"+cprylbdm+"'and PJCS='"+pjcs+"'");


Record qzlist =Db.use("szxy").findFirst("select * from t_pj_xkjxpj where zf_bj='0' and JXPJX_DM='"+jxpjxDm[i]+"'");

Record fzlist =Db.use("szxy").findFirst("select * from t_pj_djxpj where zf_bj='0' and JXPJX_DM='"+list1.getStr("JXPJFJD_DM")+"' and PDDJ_DM='"+pddjdm[i]+"' ");
Float qz = qzlist.getFloat("QZ");
Float fz = fzlist.getFloat("FZ");
df+=fz*qz;

if (r==null) {

getModel(PjGpjzb.class,"item").set("GPJZB_DM", UUIDUtil.getUUID()).set("XL_DM", xl.get("XL_DM")).set("PJCS", pjcs)
.set("JXPJX_DM", jxpjxDm[i]).set("RY_DM", rydm).set("PDDJ_DM", pddjdm[i]).set("CPRYLB_DM", cprylbdm)
.set("CJ_SJ", new Date()).set("ZF_BJ", "0").set("XG_SJ", new Date())
.set("LRR", ry != null ? ry.get("RY_DM") : "").save();;

}else {

String str = r.getStr("GPJZB_DM");
Db.use("szxy").update("update t_pj_gpjzb set PDDJ_DM='"+pddjdm[i]+"' where GPJZB_DM='"+str+"' and zf_bj=0 and XL_DM='"+xl.get("XL_DM")+"'");
}

}
Record pjdf = Db.use("szxy").findFirst("SELECT * from t_pj_pjdf where JXPJX_DM='"+list1.getStr("JXPJFJD_DM")+"' and ZF_BJ='0' and XL_DM='"+xl.get("XL_DM")+"' and BPJRY_DM='"+rydm+"' and PJRY_DM='"+ry.getStr("RY_DM")+"' and CPRYLB_DM='"+cprylbdm+"'and PJCS='"+pjcs+"'");
if (pjdf==null) {
if(text1==null){
new PjPjdf().set("JXPJX_DM", list1.getStr("JXPJFJD_DM")).set("BPJRY_DM", rydm).set("PJCS", pjcs)
.set("DF", df).set("XL_DM", xl.get("XL_DM")).set("CPRYLB_DM", cprylbdm)
.set("PJDF_DM", UUIDUtil.getUUID()).set("CJ_SJ", new Date())
.set("ZF_BJ", "0").set("XG_SJ", new Date()).set("PJRY_DM", ry.get("RY_DM")).save();
}else{
new PjPjdf().set("JXPJX_DM", list1.getStr("JXPJFJD_DM")).set("BPJRY_DM", rydm).set("PJCS", pjcs)
.set("DF", df).set("XL_DM", xl.get("XL_DM")).set("CPRYLB_DM", cprylbdm)
.set("JXBZ", text1).set("JXJY", text2)
.set("PJDF_DM", UUIDUtil.getUUID()).set("CJ_SJ", new Date())
.set("ZF_BJ", "0").set("XG_SJ", new Date()).set("PJRY_DM", ry.get("RY_DM")).save();
}

}else {
String pjdfdm = pjdf.getStr("PJDF_DM");
if(text1==null){
Db.use("szxy").update("update t_pj_pjdf set DF='"+df+"' where PJDF_DM='"+pjdfdm+"' and XL_DM='"+xl.get("XL_DM")+"'");
}else{
Db.use("szxy").update("update t_pj_pjdf set DF='"+df+"',JXBZ='"+text1+"',JXJY='"+text2+"' where PJDF_DM='"+pjdfdm+"' and XL_DM='"+xl.get("XL_DM")+"'");

}
}


} catch (Exception e) {
e.printStackTrace();
renderText("error");
}
renderText("success");
} 删除 回复

JFinal

2020-05-27 16:44

大致看了一下没有看出并发问题,检查一下 controller 中是不是有某些变量被共享了,例如 controller 中有无 static 变量属性

再一个检查一下抛出来的异常是什么,可能是某些异常引起的数据没有保存成功。例如,有些时候数据格式(例如出现 null 值但数据表字段不允许null) 的问题不能保存成功

再一个,建议开启事务,样在出问题以后可以回滚,保障一致性

最后,业务逻辑一定要放在 Service 层面,不要放在 controller 中

liubo187

2020-05-27 16:57

@JFinal 这个controller没有static属性,目前就是客户反馈说两百人同时使用这个功能的时候会出现有人无法保存的问题,让我们给他加个高并发,客户就是上帝啊。没得办法,想问下jfinal集成rabbitmq有相关demo或者文档嘛

JFinal

2020-05-27 17:03

@liubo187 两百人同时使用这个功能的时候会出现有人无法保存的问题,这个可能有很多原因,例如是不是数据库受不了这个并发量而卡死?

所以,这个你一定得做日志,然后根据异常排查原因,所以你上面的这个代码是极端错误的:
} catch (Exception e) {
e.printStackTrace();

上面的代码将异常信息隐藏了,应该要改成:
} catch (Exception e) {
log.error(e);

有了异常,你才好去找原因

JFinal

2020-05-27 17:05

关于集成 rabbitmq 有相关 demo 或者文档的问题。 jfinal 是 mvc + orm 框架,本质上是可以在 jfinal 上使用任何第三方的,不一定要有一个集成的动作

你当前已经会使用 jfinal 了, 剩下的事情就是看一下 rabbitmq 的使用文档,直接在 jfinal 中用起来

通常只要在 jfinal 提供的 onStart() 方法中初始化一下 rabbitmq 就可以使用了,有关 onStart() 的用法见这里:
https://jfinal.com/doc/2-8

liubo187

2020-05-27 17:26

@JFinal OK,感谢感谢。献上我膝盖

穿越123

2020-05-28 15:10

才200就并发问题,服务器太差了吧

liubo187

2020-05-29 09:34

@穿越123 客户要求啊,还能不做咋地

热门反馈

扫码入社