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