并发请求Jersey Rest服务

8
我正在使用Eclipse、Tomcat7和Jersey实现,与MySQL连接的一个非常简单的REST Web服务。根据Jersey文档,我知道每个请求都会创建一个新的根资源类对象。但我不知道每个请求是否是独立的,例如,如果一个请求需要等待很长时间,服务器是否会正常接受更多的请求?
问题是: 我有2个主要的类, 1个类带有Jersey注释(Proxy.java),另一个类连接到BD(Notificator.java),只有一个该类的实例(Singleton)以便仅使用一个Connection对象。实现Jersey的类使用这个类。所以,如果其中一个请求被阻塞了,我不知道其他请求是否会运行,因为它们正在使用同一个(Notificator.java)实例。
关系是 N个(Proxy.java)实例使用唯一一个(Notificator.java),其具有连接到MySQL的一个Connection。

为什么你想只有一个数据库连接? - Olimpiu POP
我这样做是为了简单起见,避免并发问题。 - David Herrero
2个回答

3
Jersey开发基于servlets。每个传入请求都有一个新的线程。如果您的代码为所有线程创建瓶颈,因为单个可用连接对象存在争用。如果您有多个请求,则只有一个请求将使用该连接,而其他请求必须等待。如果等待时间不太长,则没有问题。但是,如果等待时间超过HTTP请求超时时间,则其他请求可能会超时。
我理解您可能由于某些业务需求/复杂性而存在单连接瓶颈。因此,在所有这种情况下,我们无法同时处理所有请求,并且可能有各种原因,那么我们应该将我们的Web服务创建为异步服务。异步Web服务采用“提交请求-请求被接受(将异步处理)并返回作业URL以供轮询-客户端轮询直到作业完成”的模式。
希望能帮助到您!

每个传入请求都有一个新的线程,这是重点!!非常感谢。我知道我只使用一个连接会有瓶颈,但通常只会有2或3个同时请求,所以我认为不会有问题。但我会学习“异步Web服务”。 - David Herrero

0

谢谢,但最终我的老师告诉我连接池实现起来很困难,所以我只在Notificator类中使用了关键字“synchronized”来避免并发问题。我也意识到每次调用jersey都是独立的,因此如果其中一个调用阻塞了,其他调用仍然可以正常运行。 - David Herrero
使用synchronized关键字可以阻止其他调用。如果这正是您所需要的,那就好。 - Vitaly
我阻塞了其他调用,但当资源可用时,它们就会被唤醒。这是我的老师向我解释的。而且这对我很有效。 - David Herrero
是的,当资源可用时它们会被唤醒。 - Vitaly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接