期货不一致地返回数据

时间:2017-10-26 17:18:50

标签: java parallel-processing database-connection future

我不是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连接。

0 个答案:

没有答案