服务器是怎样响应请求的?

小弟最近在改后端项目,但出了个 bug 又解决不了,我觉得是我的后端知识太欠缺了,特来这里请教。

流程是这样的,前端有上送信息,接口收到信息后,用收到的部分信息再去第三方接口请求信息,把两部分合起来存储。
收到的信息中有一部分是用户ID(绝不重复),我用这个 ID + 收到信息的时刻(精确到秒)做 md5,生成一个唯一的序列号作为主键。

但是有些时候是上传失败的,日志是这么记录的

Could not execute JDBC batch update …… Caused by: java.sql.BatchUpdateException: ORA-00001: unique constraint (SIT_QDYY.SYS_C0010324) violated

我看了下日志,有两条一模一样的信息,按照我上面说的生成序列号的方法,这样肯定会重复。我和前端确认了下,说是不会有一秒钟上传两次的情况,所以我想是不是我收到信息后的网络请求比较耗时导致的(再想不出别的原因了)?

而且,每一条上传信息不是按顺序处理的,比如说,接口收到了 A 信息,然后解析,打印日志,还没存下来,B 信息的日志就被记录下来了,后面再是用 A 的信息请求第三方接口,存储,等等

我的猜测:
服务器是多线程的,每时每刻都在处理请求,而用 A 请求的数据再去请求第三方接口比较耗时,所以 B 请求来到以后,就去处理 B ,另开一个线程去第三方接口获取 A 相关的数据(这里都是猜测,而且和我那个 bug 有啥关系也不清楚)?

项目用的是 Struts2 + Hibernate + Oracle,部署在 Weblogic 上。

阅读 2.6k
2 个回答

js虽然是单线程的,但是请求是可以连续发的,而且加上各种网络延时,可能就造成同时到达,另外你服务器也可能把任务放在队列中,每次取个几个出来处理
再加一个随机数吧

把读写那里放到事务并锁表,干掉数据库的唯一键

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题