Runtime.getRuntime().exec() 的问题 急!!

来源:百度知道 编辑:UC知道 时间:2024/06/07 10:31:57
我在一个jsp页面中先调用:
Runtime.getRuntime.exec("一个把指定txt文件中的数据导入到数据库temp表的命令");

然后用:
ResultSet rs = statement.executeQuery("select count(*) from temp表");
我的想法是:先把txt中的数据导入到temp表(temp表开始为空),
比如txt中的10条记录被成功导入到temp表,然后查询temp表中的记录数,那么应该也是10.
但现在出现的情况是,程序是先执行的select语句,得到count为0,
然后执行exec把数据导入到temp表。这是为什么呢?我想是因为exec会开一个单独的子进程来执行命令,尽管在jsp页面中看起来是先调用的exec在select,但事实上,还是先select,后exec。
那么,现在的问题是:
怎么才能让exec先执行完,再执行select?
请大家帮忙。谢谢。
我做了很多尝试,但都不行。
比如:在Runtime.getRuntime.exec之后,用
while (true)
{ int ii;
System.out.println("开始")
if ((ii = p.exitValue()) == 0)
//或者: if ((ii = p.waitFor()) == 0)
{
break;
}
System.out.println("结束");
}
试图让exec先执行完,但总是输出一个“开始”后,就break了,没有再输出“结束”;
可问题,还是没有解决。

还有,说明一点:我那个exec中执行的命令,是正确没问题的。
就是说执行后确实能够把文件中的数据导入到temp表。
当然select语句,也是没有任何问题的。这点请相信我。

你好,你说的重写程序是不是说重写exec中执行的命令?

老实话,没什么好办法。

看看那个程序会不会输出log一类的,或者那个程序能不能重写一下,或者你有任何方法可控制它,如RV message, JMS, 等等。

此乃局限性...

重写是说,有没有办法让那个调用的程序不是使用子进程,或者让他的主进程等子进程结束在结束。exitValue()和waitFor()在被调用的程序是单一进程的时候是有效的。

另外你可以写一个.cmd来调用那个程序,看看是否在insert完成之前命令行就已经返回,确定是否是一个子进程。

其他方法有

- 监视此进程的log
- 让此进程insert完毕时发回一个信息(JMS, RV, 等等)

但都要看这个程序的写法了。如果他没有任何征兆的起一个子进程马上返回并且没有任何的其他输出,那是没办法的。