Det är förvånande att kommandot du visar fungerar överhuvudtaget, eftersom du misslyckas med att citera mellanslagen i kommandosökvägen. Försök:
String[] cmd = {
"D:\\Program Files\\PostgreSQL\\9.1\\bin\\pg_restore.exe",
"--host", "localhost",
"--port", "5432",
"--username", "postgres",
"--dbname", "mytestqq",
"--role", "postgres",
"--no-password",
"--verbose",
"D:\\sathish\\rawDatabase.backup"
};
p = r.exec(cmd);
Ändringar:
- Konvertera enkelsträngsformen till den mycket säkrare argumentmatrisformen för
exec
ring; - Dubbla omvända snedstreck i
rawDatabasen
sökväg eftersom ditt ursprungliga kommando misslyckas med att undvika snedstreck, så\r
är en vagnretur i strängen istället för\
char följt avr
röding. - Byt till dubbla bakåtstreck istället för snedstreck framåt på programsökvägen för konsekvens. Denna förändring spelar förmodligen ingen roll.
Kontrollera även processens returstatus. Du måste använda Process.waitFor()
sedan när den har avslutat, använd Process.exitValue()
för att bestämma resultatet. Du bör undersöka stderr och stdout som fångas av Process
objekt för fel och loggningsinformation.
Anledningen till att ditt program fortsätter att inte fungera beror förmodligen på:
- Du har gamla
pg_restore
processer som hänger runt och håller lås; och/eller - Du använder inte stdout och stderr så
pg_restore
får slut på buffrat rörutrymme och blockerar skrivning på utgångsströmmen.
Allt detta blir mycket enklare om du använd ProcessBuilder
istället
. ProcessBuilder låter dig tillhandahålla filströmmar att skriva utdata till och tar i allmänhet hand om mycket av detta åt dig. Du måste fortfarande vänta på att processen ska avslutas och kontrollera dess returkod.