针对单个客户端请求并行进行多个数据库查询

时间:2012-03-29 20:04:07

标签: java multithreading parallel-processing hector

要完成用户的某些请求,在我的应用程序中,我从单个方法发出多个数据库查询,但它们当前正在顺序执行&因此,应用程序被阻止,直到它收到上一个查询的响应/数据为止,然后继续下一个查询。这不是我喜欢的东西。我想发出并行查询。

在发出查询之后,我还想做一些其他工作,(而不是在之前的查询响应之前被阻止)&在获取每个查询的响应时,我想执行特定于每个查询数据的代码块。这样做的方法是什么?

编辑:我的数据库API确实提供了连接池。


只是熟悉Java多线程

Using:-
------
Java 1.6
Cassandra 1.1 Database with Hector

3 个答案:

答案 0 :(得分:0)

在开始这样做之前你应该明白

  1. 要从并发中受益,您需要拥有多个数据库连接。解决此问题的最佳方法是创建数据库池。

  2. 您需要创建一个runnable / callable类来执行db语句。您需要将一些消息传递系统放在一起,以便在您的查询完成时向监听器发出警报

  3. 了解当您同时发送多个请求时,所有投注都将首先完成,并且可能会导致您的应用程序不稳定的语句之间存在冲突。

答案 1 :(得分:0)

我有类似的任务/问题。对于完整的构建结果,我需要发送几个不同服务的请求(很少在REST上,很少在Thrift上),以减少我需要并行发送的延迟。我的想法是使用java.util.concurrent.Future,创建简单的聚合管理器,它一起创建许多请求,并将等待最后检索到的响应并返回所有需要的数据。在更高级的解决方案中,此管理器可以在其他查​​询期间进行/组合最终结果,但此解决方案可能不是线程安全的。

答案 2 :(得分:-3)

这是一个非常微不足道/有限的方法:

final Connection conn = ...;
final Object[] result = new Object[1];
Thread t1 = new Thread(new Runnable() {
    public void run() {
        Object results = conn.executeQuery();
        result[0] = results;
    }
});
t1.setName("DBQueryWorker");
t1.start();
// do other work
while (t1.isAlive()) {
   // wait on thread one
}

这是一种简单的方法,但其他许多方法都是可行的(例如,通过Java并发任务执行程序,Spring任务执行程序等进行线程池化)。