我不是Java期货专家,但我正在尝试使用可调用任务并行进行数据库调用。 所以我创建的每个可调用任务基本上执行参数子集的整个查询 为简单起见,假设它类似于
SELECT * FROM TABLE WHERE EMPLOYEES IN (A,B,C,D)
编辑:
SELECT * FROM TABLE WHERE SOME CASE // whole query takes lot of time
假设我们拥有这些参数的大量数据 相反,我有
的可调用任务SELECT * FROM TABLE WHERE EMPLOYEES IN (A)
SELECT * FROM TABLE WHERE EMPLOYEES IN (B)
SELECT * FROM TABLE WHERE EMPLOYEES IN (C)
SELECT * FROM TABLE WHERE EMPLOYEES IN (D)
修改
SELECT * FROM TABLE WHERE SUBSET 1 OF PARAMETERS
SELECT * FROM TABLE WHERE SUBSET 2 OF PARAMETERS
SELECT * FROM TABLE WHERE SUBSET 3 OF PARAMETERS
SELECT * FROM TABLE WHERE SUBSET 4 OF PARAMETERS
使用期货这就是我想要做的事情
List<Future<T>> resultFutures ; //T is just a ResultSet parsed into a List of POJO.
SomeList //list of A,B,C,D as shown above
.parallelStream()
. forEach(chunk -> {
tasks.add(new Task<>(
chunk
));
});
resultFutures = executor.invokeAll(tasks);
考虑执行与数据库的新jdbc连接并返回结果的每个任务。 我这样做是为了得到期货的结果
resultFutures
.parallelStream()
.map(future -> {
try {
return future.get();
}
catch (Exception e) {
throw new IllegalStateException(e);
}
})
.flatMap(f -> f.parallelStream())
.collect(Collectors.toList());
这是正常的,但结果是不可预测的,有时我会得到更少的行,而有时我得到正确的结果。 如果结果行小于预期,则不会抛出异常。 你能告诉我们这是否是使用期货的正确方法吗? 我的数据库是SQL服务器,我通过spring使用jdbc连接。