java方法中的多While循环

java方法中的多While循环,java,Java,我有一个java方法,它将内容写入一个文本文件,其值由| symbol限制。需要根据条件从10个表中提取内容并写入文件。目前我正在做以下的方法。请任何人提出一个更好的替代方法来满足这一要求。此方法是否存在性能瓶颈 public static void createFile() { queryFromTable1 whileLoopForqueryFromTable1 { writer.write(valu

我有一个java方法,它将内容写入一个文本文件,其值由| symbol限制。需要根据条件从10个表中提取内容并写入文件。目前我正在做以下的方法。请任何人提出一个更好的替代方法来满足这一要求。此方法是否存在性能瓶颈



    public static void createFile()
    {
        queryFromTable1
        whileLoopForqueryFromTable1
        {
            writer.write(value1+"|"+value2+"|".....)
        }
        queryFromTable2
        whileLoopForqueryFromTable2
        {
            writer.write("||||"+value4+"|".....)
        }
        queryFromTable2
        whileLoopForqueryFromTable2
        {
            writer.write("||"+value5+"|".....)
        }
    }


一个可能的瓶颈是,如果任何查询速度慢,那么所有剩余的查询都必须等待较早的查询完成。另一个可能的瓶颈是算法是单线程的

要解决这个问题,一个解决方案是并行读取,并在多个编写器中处理写入。当所有这些都完成后,只需按单线程的正确顺序合并写入程序。Java8类CompletableFuture提供了一些很好的特性,可以在这里使用。只需创建一些完成并合并输出的未来

有关更多信息,请查看

该算法的一个示例可能类似于下面的代码。请注意,这只是一个示例,不是一个完整的解决方案。StringWriter的使用只是为了方便起见,只是处理数据的一种方式

public class AlgorithmTest {
    public static void main(String[] args) 
            throws IOException, ExecutionException, InterruptedException {

        // Setup async processing of task 1
        final CompletableFuture<String> q1 = CompletableFuture.supplyAsync(() -> {
            // Setup result data
            StringWriter result = new StringWriter();

            // execute query 1

            // Process result
            result.write("result from 1");

            // Return the result (can of course be handled in other ways).
            return result.toString();
        });

        // Setup async processing of task 2
        final CompletableFuture<String> q2 = CompletableFuture.supplyAsync(() -> {
            // Setup result data
            StringWriter result = new StringWriter();

            // execute query 2

            // Process result
            result.write("result from 2");

            // Return the result (can of course be handled in other ways).
            return result.toString();
        });

        // Write the whole thing to file (i.e. merge the streams)
        final Path path = new File("result.txt").toPath();
        Files.write(path, Arrays.asList(q1.get(), q2.get()));
    }
}

您可以创建用于从表中提取数据的单独方法

private List<String> getDataFromTable("select * from table1"){...}

更多信息将允许我们给出更好的答案。

此伪代码中没有性能瓶颈

如果您使用的是a,我认为可以多次呼叫write。你只需要在治疗结束时别忘了关闭writer


现在我们不知道您的DB查询背后是什么。也许它们可以被优化。您是否使用?

尝试分解为几种方法,下面是伪代码:

void createFile() {
    writeTo(out, query1);
    writeTo(out, query2);
    writeTo(out, query3);
    ....
}

void writeTo(out, query) {
    execute query
    loop(){
      out.write(...)
    }
}

您的伪代码不清楚,您没有解释作为分隔符使用的管道数量背后的逻辑是什么,而且,根据您的逻辑,value5不一定会在value4I之后显示,我认为这是属于的,试一试stringbuffer怎么样?编写器正在写入一个文件,您无法并行化它。但基本思想很好:并行读取,将结果合并到一个对象中,并在完成后使用一次写入操作写入聚合结果action@alfasin-正是在你发表评论前的1秒钟,我就写了这篇文章;。写入程序的合并必须以某种方式进行单线程同步,但在合并之前,各个写入操作可以是并行的。是否将数据写入缓冲区,然后写入。刷新将缓冲区写入磁盘?我们真的需要并行化吗?@gkiko-这取决于你使用哪种编写器。我的意思是,如果并行处理读写操作,并且写操作是流写器,则单独的写操作存储在内存中。然后你可以将不同的流合并成某种文件流。@gkiko-我用一个例子更新了答案,以澄清我的目的。
void createFile() {
    writeTo(out, query1);
    writeTo(out, query2);
    writeTo(out, query3);
    ....
}

void writeTo(out, query) {
    execute query
    loop(){
      out.write(...)
    }
}