我无法为此找到合适的解决方案:

我有几个结构相同但数据不同的数据库。而且,当我的Web应用程序执行查询时,必须将每个数据库的查询分开,并异步执行它,然后汇总来自所有数据库的结果并将其作为单个结果返回。另外,我希望能够传递将在其中执行查询的数据库的列表,并且我还希望传递用于查询执行的最大到期时间。结果还必须包含每个数据库的元信息,例如多余的执行时间。

如果可以使用其他数据源(例如带有特定API的远程Web服务)而不是关系数据库,那将是很好的。

我使用Spring / Grail并需要Java解决方案,但是我会很乐意提供任何建议。

UPD:我想找到准备好的解决方案,也许是框架之类的东西。

最佳答案

这是基本的OO。您需要从实现机制中抽象出要实现的目标-加载数据-数据库查询或Web服务调用。

这样的设计通常会包含一个接口(interface),该接口(interface)定义可以完成的工作的约定,然后根据其实现来实现多个实现类。

例如,您最终会看到一个类似于以下内容的界面:

public interface DataLoader
{
    public Collection<Data> loadData() throws DataLoaderException;
}

然后,您将拥有JdbcDataLoaderWebServiceDataLoader等实现。在您的情况下,您将需要另一种实现,给定一个或多个DataLoader实例,它们将以可累加方式运行每个结果。该实现看起来像:
public class AggregatingDataLoader implements DataLoader
{
  private Collection<DataLoader> dataLoaders;
  private ExecutorService executorService;

  public AggregatingDataLoader(ExecutorService executorService, Collection<DataLoader> dataLoaders)
  {
    this.executorService = executorService;
    this.dataLoaders = dataLoaders;
  }

  public Collection<Data> loadData() throws DataLoaderException
  {
    Collection<DataLoaderCallable>> dataLoaderCallables = new ArrayList<DataLoaderCallable>>();

    for (DataLoader dataLoader : dataLoaders)
    {
      dataLoaderCallables.add(new DataLoaderCallable(dataLoader));
    }

    List<Future<Collection<Data>>> futures = executorService.invokeAll(dataLoaderCallables);

    Collection<Data> data = new ArrayList<Data>();
    for (Future<Collection<Data>> future : futures)
    {
       add.addAll(future.get());
    }

    return data;
  }

  private class DataLoaderCallable implements Callable<Collection<Data>>
  {
    private DataLoader dataLoader;

    public DataLoaderCallable(DataLoader dataLoader)
    {
      this.dataLoader = dataLoader;
    }

    public Collection<Data> call()
    {
      return dataLoader.load();
    }
  }
}

您需要为此添加一些超时和异常处理逻辑,但是要点。

另一个重要的事情是,您的调用代码应该只使用DataLoader接口(interface),以便您可以在测试过程中进出交换不同的实现或使用模拟。

关于java - 来自不同数据源和数据库的异步多重查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16233755/

10-10 08:46
查看更多