5

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

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

编辑:我的 DB API 确实提供了连接池。


只是对 Java 多线程有点熟悉。

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

3 回答 3

0

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

于 2012-04-24T14:22:34.570 回答
0

在开始执行此操作之前,您应该了解

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

  2. 您需要创建一个可运行/可调用的类来执行 db 语句。您需要组合一些消息系统来提醒听众您的查询何时完成

  3. 了解当您同时发送多个请求时,关于哪个将首先完成的所有赌注都将失败,并且声明之间可能存在破坏您的应用程序稳定性的冲突。

于 2012-03-29T20:16:49.273 回答
-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 任务执行器等进行线程池)。

于 2012-03-29T20:12:03.693 回答