process.waitFor() 不返回
process.waitFor() not returning
我想从 Postgres SQL 脚本迁移数据。
我正在使用下面的代码。
void importDatabase() {
final Process process = Runtime.getRuntime().exec("psql -f ./test.sql postgresql://postgres:root@127.0.0.1:5432/testdb");
//Wait to get exit value
try {
if (process.waitFor() != 0) {
String line;
BufferedReader input = new BufferedReader(new InputStreamReader(process.getErrorStream()));
while ((line = input.readLine()) != null) {
log.error(line);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
waitFor
没有返回任何东西,它只是永远等待。
注意:我的test.sql
有很多查询,所以它会显示很多日志条目。
问题:
如何解决这个问题?
如果涉及到缓冲区内存,如何清除缓冲区?
谢谢。
如果由 Runtime.exec()
执行的进程产生输出 - stdout
或 stderr
- 那么为了使其稳健运行,您需要在调用 Process.waitFor()
。最有可能的是,您的 psql
进程被阻塞是因为它正在等待读取其输出的内容,而您直到 Process.waitFor()
完成后才开始这样做。
您可能需要在单独的线程中使用输出,除非您确切知道预期的输出是什么。在任何情况下,调用 psql
可能有问题,也可能没有问题——除非您捕获它的输出,否则您可能不知道。
Runtime.exec()
的稳健和便携使用非常困难。我已经详细地写了这个,这里有代码示例:
我想从 Postgres SQL 脚本迁移数据。 我正在使用下面的代码。
void importDatabase() {
final Process process = Runtime.getRuntime().exec("psql -f ./test.sql postgresql://postgres:root@127.0.0.1:5432/testdb");
//Wait to get exit value
try {
if (process.waitFor() != 0) {
String line;
BufferedReader input = new BufferedReader(new InputStreamReader(process.getErrorStream()));
while ((line = input.readLine()) != null) {
log.error(line);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
waitFor
没有返回任何东西,它只是永远等待。
注意:我的test.sql
有很多查询,所以它会显示很多日志条目。
问题:
如何解决这个问题?
如果涉及到缓冲区内存,如何清除缓冲区?
谢谢。
如果由 Runtime.exec()
执行的进程产生输出 - stdout
或 stderr
- 那么为了使其稳健运行,您需要在调用 Process.waitFor()
。最有可能的是,您的 psql
进程被阻塞是因为它正在等待读取其输出的内容,而您直到 Process.waitFor()
完成后才开始这样做。
您可能需要在单独的线程中使用输出,除非您确切知道预期的输出是什么。在任何情况下,调用 psql
可能有问题,也可能没有问题——除非您捕获它的输出,否则您可能不知道。
Runtime.exec()
的稳健和便携使用非常困难。我已经详细地写了这个,这里有代码示例: