gpt4 book ai didi

java - 数据库不同数据源的异步多查询

转载 作者:行者123 更新时间:2023-12-02 07:04:47 24 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

这是基本的面向对象。您需要从您用来实现的机制(数据库查询或 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com