0

我有一个 servlet,它执行以下操作:

  1. 从 Web 服务获取一组数据
  2. 从本地数据库中获取一组数据。
  3. 合并这两个集合并返回结果。

实际上,这在 servlet 代码本身中几乎没有完成,但是 servlet 调用执行上述操作的 Java 类。

由于大部分时间都花在等待 web 服务和数据库上,我正在考虑同时执行这两者:将 webservice 调用放在一个线程中,从数据库中获取数据,然后等到 web 服务完成后再继续。这看起来应该可以正常工作,但我经常听说从 servlet 启动线程是个坏主意?我很难看到这种情况会如何导致问题。任何帮助都会很棒(在 linux 上使用 tomcat 6)。谢谢!

4

3 回答 3

1

我看不出有什么问题,并且经常看到线程是从 servlet 本身启动的。您的用例是在 servlet 中启动线程的良好理由。

于 2012-05-29T19:26:47.263 回答
0

每次请求到达服务器时,容器都会分配或创建一个新线程来处理请求,对于每个请求,每次在其自己的堆栈中调用 service() 方法,然后 service() 方法根据 Http 调用 doGet 或 doPost要求。现在完全可以使用限制在 doGet 或 doPost 范围内的线程。

于 2012-05-29T19:21:44.893 回答
0

系统可以同时支持的线程数是有限的资源。此外,创建线程是一项昂贵的操作。因此,现代 servlet 容器不会为每个请求创建新线程,而是维护线程池。池中的一个线程被分配给传入请求。如果所有线程都忙,则将请求放入队列或创建新线程(取决于 servlet 容器使用的策略)。

所以,创建线程肯定会起作用(从功能的角度来看),但是如果你有很多请求,你的服务器就会开始阻塞。您可以使用与 servlet 容器使用的策略类似的策略。Java 已经为这类任务提供了框架。查看 javadocs for Executor和相关类。

于 2012-05-29T19:48:19.233 回答