2011-05-08 104 views
2

我想为一系列数据库调用(串行)创建ThreadPool。我们想要保存那些毫秒。所以我们不想浪费时间来串行执行数据库查询。 我正在处理已经有很多并行节点的服务器应用程序。在其中一个节点中,有一系列数据库调用。我想在已经与其他节点并行运行的节点内引入并行性。Java:在服务器应用程序中创建线程池

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

This is the example that I have found.

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

+0

你使用什么容器?有可能它已经支持它。 – h3xStream 2011-05-08 16:10:08

+0

我们正在使用Geronimo。 – 2011-05-08 16:15:21

回答

4

在Java EE环境中产生自己的线程通常是一个糟糕的主意。有时需要完成,但如果有其他选择,则不应该这样做。我不确定你想要做什么,以及你正在使用什么版本的Java EE,但是如果它是6,那么也许你可以使用asynchronous EJB.

+0

我们使用Java 6,Geronimo容器。所以我们的架构提倡线程化。当请求进入时,我们从请求中创建独立的节点并且并行地执行它。现在我的问题是需要并行化的节点之一。我了解异步EJB或消息传递可能是一个解决方案。但是,我们可以坚持线程化吗? – 2011-05-08 16:19:11

+0

这个线程解决方案有什么缺点吗? – 2011-05-08 16:22:30

+0

当您使用异步EJB(或JMS)时,您仍在使用线程,只是容器正在为您管理线程。如果你尝试自己产卵和管理线程,我保证你会遇到问题。看到这里进一步的解释:http://stackoverflow.com/questions/533783/why-spawning-threads-in-j2ee-container-is-discouraged – 2011-05-08 16:30:32

3

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

这种方法还有另外一个优点:如果你正在使用多台物理服务器,工作将分布在其中,因此系统将更加强大。

+0

因此,使用线程池执行程序进行线程化是一个坏主意?在这种情况下线程有什么缺点? – 2011-05-08 16:21:08

+2

线程池执行器是一个好主意。但是它在JEE环境中是被禁止的。你应该让应用程序。服务器来管理线程。我知道只有2种“合法”方式可以做到这一点:JMS和JCA(它允许你请求应用程序服务器从其线程池中获取线程)。但是绝对不要在JEE环境中管理自己的线程!显然,如果你正在实现你自己的独立应用程序,你可以做到这一点。 – AlexR 2011-05-08 16:27:30

+0

如何使用Geronimo线程池? http://geronimo.apache.org/apidocs/2.0.1/org/apache/geronimo/pool/ThreadPool.html – 2011-05-08 16:44:15