代码之家  ›  专栏  ›  技术社区  ›  Kraken

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

  •  2
  • Kraken  · 技术社区  · 13 年前

    在我的应用程序中,我必须读取大量的数据。在我得到所有的数据后,我把它放在一个列表中,并对其进行处理,然后进行相应的工作。

    现在我想知道我是否可以做些什么,有什么可以加快从数据库获取数据的过程吗?我的数据库位于不同的服务器上,我正在使用java与数据库进行交互。

    我没有一个确切的数据大小,即我需要处理的特定行数。我还听说我可以选择多线程,但那该怎么办呢?因为我不知道如何划分我的数据,因为它是不确定的。即,如果要应用以下伪代码

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

    或者,我可以根据某个属性对数据进行散列,然后告诉每个线程获取映射的特定索引,但在获取数据之前,我如何对其进行映射?

    我可以研究所有可能的解决方案,以及如何着手?如果你需要更多信息,请告诉我。

    谢谢

    1 回复  |  直到 13 年前
        1
  •  4
  •   amit    13 年前

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

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

    但那该怎么办呢?

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

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

    我在这里假设,一旦您“越界”,服务器就会返回 null (或 requestChunk() 处理它并返回null)。

    或者我可以根据一些属性对数据进行散列,然后告诉 每个线程获取映射的特定索引

    如果您需要迭代数据并检索所有数据,那么哈希通常是一个糟糕的解决方案。它的缓存效率非常低,而且对于这种情况来说开销太大了。