问题描述
给一个系统写服务端api,采用的spring+jersey的代码架构如下图

定义了一个InfoResource,其中使用@autowired 来注入对应的InfoQueryService,调用方式如下。测试时发现,如果单线程调用接口则一切正常,如果多线程并发调用这个接口,则部分请求返回内容是不完整的,然而程序运行并没有任何报错。
// InfoResource.java
@Path("/info")
@Component
public class InfoResource {
@Autowired
private InfoQueryService infoQueryService;
.......
@POST
@Path("/json/upload")
@Consumes({
MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, MediaType.APPLICATION_FORM_URLENCODED })
@Produces(MediaType.APPLICATION_JSON)

本文介绍了在使用Spring+Jersey编写API服务端时遇到的并发请求问题,问题源于@Autowired注解导致的服务单例模式在高并发下引发的内容不完整。通过在Service层添加synchronized暂时解决问题,但牺牲了性能。进一步分析发现,问题出在Service到Resource的注入环节。解决方案是将单例注入改为多例注入,避免并发冲突。文中提供了注解方式实现多例注入的代码示例,并提及多例注入对性能的影响。
最低0.47元/天 解锁文章
1730

被折叠的 条评论
为什么被折叠?



