以最有效的方式从数据库中获取大量数据

时间:2012-08-23 06:13:04

标签: java database multithreading performance

在我的应用程序中,我必须阅读大量数据。获得所有数据后,我将其放入列表并对其进行处理并相应地进行操作。

现在我想知道我是否可以做任何事情,还有什么可以加速从数据库进程中获取数据?我的数据库位于不同的服务器上,我正在使用java与数据库进行交互。

我没有确定的数据大小,即我需要处理的特定行数。另外我听说我可以去多线程,但那怎么办呢?因为我不知道如何对我的数据进行分区,因为它是无限期的。即如果要应用以下伪代码

for(i=0 to number of partition) // Not certain on the number of partitions
    create new thread and get data.

或许我可以在某些属性的基础上散列数据,然后告诉每个线程获取地图的特定索引,但是如何在获取数据之前映射它?

我可以研究所有可能的解决方案,我该如何解决?如果您需要更多信息,请与我们联系。

感谢。

1 个答案:

答案 0 :(得分:3)

  

我听说我可以选择多线程,但那怎么办呢?

这绝对是加速从远程服务器查询信息的好选择。
通常在这些任务中 - 服务器的IO是主要的瓶颈,通过多线程 - 可以同时“请求”多行 - 有效地减少IO等待时间。

  

但是怎么办呢?

这个想法是将工作分成更小的任务。有关更多详细信息,请查看java high level concurrency API
一种解决方案是让每个线程从服务器读取一个大小为M的块,并在其中仍有数据(服务器)时为每个线程重复该过程。类似的东西(对于每个线程):

data = "start";
int chunk = threadNumber;
while (data != null) {
  requestChunk(chunk);
  chunk += numberOfThreads;
}

我假设一旦你“超出界限”,服务器返回null(或requestChunk()处理它并返回null)。

  

或许我可以根据某些属性对数据进行哈希处理,然后告诉我   每个线程来获取地图的特定索引

如果您需要迭代数据并检索所有数据 - 散列通常是一个糟糕的解决方案。缓存效率非常低,而且这种情况下的开销太大了。