1

我有一个 Java EE Web 应用程序。现在,当一个特定的请求到来时(比如 /xyz url 模式),我想做如下复杂的处理

以下 3 个步骤中的每一个都非常复杂且需要时间。

  1. 从 DB 中获取一张表的数据。表数据量大,查询需要时间。
  2. 对其他一些网络服务 A 进行网络服务调用并获取其数据。
  3. 对其他一些网络服务 B 进行另一个网络服务调用并获取其数据。
  4. 使用 1, 2, 3 的输出做一些处理

1、2、3相互独立,可以并行调用。

现在的问题是:

  1. 我可以在三个单独的线程中执行操作 1、2 和 3 吗?
  2. 是否建议为每个请求创建 3 个线程?
  3. 我应该使用线程池吗?
4

2 回答 2

1

为了解决您的第一个问题,我经历了 4 个步骤:

  1. 是的,如果您使用的数据库驱动程序允许并发访问,则分别可以安全地从不同线程使用。
  2. Web 服务通常设计为同时处理不同的请求,因此这应该也可以,这里的问题是您要使用多少线程(以及处理一个请求需要多长时间)以及 Web 服务是否会一次保护自己免受太多请求。
  3. 这里同样适用。
  4. 是的,但是您必须在此处进行同步,例如:等到所有线程都收到它们的结果。您可以使用java.util.concurrent.CyclicBarrier来实现这一点

第二个问题 这取决于您的数据,尤其是网络服务的响应速度,您应该尝试一下。

第三个问题明确地说,这就是他们的目的。这也将帮助您构建应用程序。

于 2012-07-18T18:14:38.570 回答
1

1)我可以在三个单独的线程中执行操作 1 ,2 和 3 吗?是的你可以。

2) 是否建议为每个请求创建 3 个线程?只要这些东西不相互依赖,并且只要你不依赖于在同一个事务中获得这些东西,那么看起来应该没问题。当然,您将不得不处理一个或多个线程不成功的情况。如果线程花费的时间太长或返回失败,您将需要一个单独的看门狗线程来取消线程。

3)我应该使用线程池吗?不管你做什么,每当你使用线程时,你都应该使用一个池。这样,如果出现线程未完成或进入某种不良状态或以其他方式变得不可用的问题,您可以保护您的应用程序不会耗尽线程。

于 2012-07-18T18:15:18.413 回答