从Servlet请求产生线程

时间:2016-01-31 22:59:30

标签: java json multithreading servlets

有一个由servlet管理的REST类型的Web服务。

它从数据库中检索大约1000个产品及其spcifications。 这个数据库查询很快。 然后Web服务循环遍历这1000个条目,对于每个产品规范,它将其编码为JSON字符串。每个JSON编码需要10毫秒。因此,通过1000个产品需要10ms x 1000 = 10秒。因此Web服务响应很慢。超过10秒。

我想知道是否可以同时进行此处理,因为将每个产品规格格式化为JSON字符串完全独立于一个产品到下一个产品。所以从理论上讲,如果我创建了一个说4个线程的池,我可以给每个线程250个产品规格并同时重新格式化为JSON,并将处理时间减少近4个。

这在servlet上下文中如何实现?我可以从Servlet或Servlet使用的POJO生成线程池吗?由于像Jetty这样的Servlet容器已经是多线程的,这是否会导致冲突?

由于

2 个答案:

答案 0 :(得分:2)

  

这在servlet上下文中如何实现?

这实际上取决于您的工作量。如果你同时提供许多这样的请求,你会看到很少的收获。

但是,如果您的服务器每分钟处理10个查询,那么确保所有这些核心都能正常运行。

但请记住,您为每个客户端分配了相当多的额外资源,因此您实际上可以获得更好的性能以降低可扩展性。

  

我可以从Servlet或由a使用的POJO生成一个线程池   的Servlet

是的,绝对的。在使用EJB时​​,您不希望乱用线程,但使用servlet完全可以。

  

由于像Jetty这样的Servlet容器已经是多线程的,所以   这会导致冲突吗?

不,完全没有(但请看我上面提到的问题)。大多数Web服务器都是高度线程化的,因为大多数这些线程都是I / O绑定的,给客户端提供勺子的东西 - 使用非阻塞/事件驱动的IO,所需的线程数实际上要低得多。

答案 1 :(得分:0)

如果对所有其他请求者的服务器使用情况公平,则10秒内的Web服务可能没问题。否则,确定,并发(当然限制线程)。

对于ForkJoinPool(java7)来说,这是一个完美的工作。

仅供参考,我会认真考虑jvm分析这个10ms的jason编码......看起来非常长。