2012-03-29 64 views
5

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

也发出查询后,我想做一些其他的工作,而不是被阻止,直到以前的查询响应&获取每个查询的响应我想执行特定于每个查询的数据的代码块。有什么办法做到这一点?

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


只是一点点熟悉Java多线程。

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

这里有很多错综复杂的东西。我建议先阅读关于Java线程的一些知识:http://docs.oracle.com/javase/tutorial/essential/concurrency/ – Gray 2012-03-29 20:06:23

回答

-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并发任务执行线程池,春季任务执行等) 。

+1

这基本上是单线程的,因为你只有1个Connection对象,并且主线程等待(以错误的方式 - 在请求线程上使用join()) – ControlAltDel 2012-03-29 20:19:00

+0

@ user1291492:因为这种解决方案是错误的,您可以在答案中添加一些关于如何实现这个的代码示例/提示吗? – 2012-03-30 05:16:20

+0

我认为这是单线程的并不公平。他的“其他工作”很容易在连接忙碌时完成(假设它不使用它)。最终,他可能需要多个连接来处理他的多线程场景,但这只是一个基本的例子,而不是一个完整的解决方案。 虽然我同意在最后使用连接而不是忙碌等待的建议。 – jsight 2012-03-30 15:23:07

0

你开始做这个

  1. 之前从并发受益你应该明白,你需要有多个数据库的连接。解决这个问题的最好方法是创建一个数据库池。

  2. 您需要为执行db语句创建一个runnable/callable类。您需要将一些消息系统放在一起,以便在查询完成时提醒听众

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

+0

我的数据库访问API提供连接池。我是否需要确定多个数据查询中的哪些将首先完成?不管它是什么完成,它会导致执行其特定的代码块? – 2012-03-30 05:21:44

0

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

相关问题