2012-04-18 22 views
0

我有一个长字符串被并行查询。我想要做的是将字符串解析为更小的单元,并将每个单元发送到远程数据库并获取每个单元的查询结果。使用线程池查询远程数据库

我的并行化是这样工作的:每个分析过的字符串都需要查询远程数据库,所以我创建了一个线程池,并添加了几个可查询数据库的每个分析字符串的runnable。但在这种情况下,我只有一个数据库实例。因此,代码大致是这样的:

for (String s : bigQuery) 
    // this function connects to that database instance and queries the string "s" 
    queryMyDatabase(s, databaseInstance); 

不幸的是我的线程池实现不增加我的查询速度,我想知道是否是因为我只用一个单一的客户端/实例。在这种情况下,我需要实现连接池吗?我使用CouchDB作为远程数据库,你有没有关于连接池的建议?

+0

我会认为如果你在所有线程中查询同样的东西,那么如果你一次完成它就会更快。由于创建线程,准备语句,旅行时间到数据库等,并行执行它实际上会慢一些。 – mezzie 2012-04-18 14:27:08

回答

3

假设您的线程实现是正确的,问题可能是所有的查询都与数据库共享同一个连接。您可以尝试将每个查询分配给它自己的,单独的数据库连接(如果您愿意,可以从池中提取)。

另一种可能性是数据库无法足够快地处理您的请求,所以在您身边的并行性并没有给您太大的帮助。

+0

谢谢您的回复!是的,所有查询都使用相同的数据库连接。我将尝试创建一个数据库池。你有什么建议吗? java是否支持任何连接池实现? – anvarik 2012-04-18 20:08:19

+0

对于快速测试,您可能只需在每个线程中手动打开新的数据库连接。有几个Java连接池实现可用:http://www.tomcatexpert.com/blog/2010/03/12/explaining-jdbc-pool-high-concurrency-alternative-connection-pooling-module – maximdim 2012-04-18 20:11:53