【问题标题】:Java : Creating a Thread Pool in the Server applicationJava:在服务器应用程序中创建线程池
【发布时间】:2011-08-21 04:15:05
【问题描述】:

我想为一系列数据库调用(串行)创建一个线程池。我们想节省那些毫秒。所以我们不想浪费时间在串行执行数据库查询上。 我正在开发一个已经有许多并行节点的服务器应用程序。在其中一个节点中有一系列数据库调用。我想在已经与其他节点并行运行的节点内引入并行性。

线程池执行器是一个不错的选择吗?我不知道我将运行多少个查询。这取决于请求对象的状态。所以无法修复线程池的队列大小。

This is the example that I have found.

这样有效吗?还有其他选择吗?任何建议将不胜感激。

【问题讨论】:

  • 您使用的是什么容器?它可能已经支持它。

标签: java multithreading jakarta-ee thread-safety threadpool


【解决方案1】:

在 Java EE 环境中生成自己的线程通常是个坏主意。有时必须这样做,但如果有其他选择,你不应该这样做。我不确定您到底要做什么,以及您使用的是什么版本的 Java EE,但如果它是 6,那么也许您可以使用 asynchronous EJB.

【讨论】:

  • 我们使用的是 Java 6,Geronimo 容器。所以我们的架构提倡线程。当请求进来时,我们从请求中创建独立的节点并让它并行执行。现在我的问题是需要并行化的节点之一。我了解异步 EJB 或消息传递可能是一种解决方案。但是有什么方法可以让我们坚持线程化吗?
  • 当您使用异步 EJB(或 JMS)时,您仍在使用线程,只是容器正在为您管理线程。如果您尝试自己生成和管理线程,我保证您会遇到问题。请参阅此处以获取更多说明:stackoverflow.com/questions/533783/…
  • 回复:Java 版本。我说的是 Java EE 的版本,不是 Java 运行时。据我所知,Geronimo 只实现了 Java EE 5。
  • 如果我使用 Geronimo 线程池怎么样? geronimo.apache.org/apidocs/2.0.1/org/apache/geronimo/pool/…
  • 根据所使用的 JEE 技术,其中一些提供应用程序范围的 bean,例如 JSF 和 Seam。使用这种技术时,这不是一个坏主意。就个人而言,我会尝试利用以下之一:Application Scoped beans、EJB3.1 @Asynchronous、JMS 或广泛使用的 Quartz 库。
【解决方案2】:

您的问题的标准解决方案是使用 JMS。每个查询都应包装到命令中。命令应作为 JMS 消息发送到队列。 MDB(消息驱动bean)应该接收它们的消息并异步执行查询。

这种方法还有另一个优点:如果您使用多台物理服务器,工作将分布在它们之间,因此系统将更加健壮。

【讨论】:

  • 那么使用线程池执行器进行线程处理是个坏主意?这种情况下线程有什么缺点?
  • 线程池执行器是个好主意。但在 JEE 环境中是禁止的。你应该让 app.服务器来管理线程。我只知道 2 种“合法”的方式来做到这一点:JMS 和 JCA(允许您请求 app.server 从其线程池中获取线程)。但是永远不要在 JEE 环境中管理自己的线程!显然,如果您要实现自己的独立应用程序,则可以这样做。
  • 如果我使用 Geronimo 线程池怎么样? geronimo.apache.org/apidocs/2.0.1/org/apache/geronimo/pool/…
  • 可能没问题,但它是 Geronimo 的专有 API。我认为使用容器的专有 API 是一种不好的做法。我更喜欢标准的 JEE 解决方案。
  • 我也更喜欢使用 JMS 或 EJB 之类的东西。这完全取决于我们有多少时间来实现它。感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 2013-12-24
  • 2010-11-20
  • 1970-01-01
  • 2010-11-29
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多