日期:2014-05-18  浏览次数:20872 次

java执行sql文件数据库恢复,求大神指导,实在找不出那里有问题

下面的是代码:
本地数据库已经有pcyjxt1库有t_s_depart表,表里面无数据
t_s_depart.sql文件内容
创建删除
DROP TABLE IF EXISTS `t_s_depart`;
CREATE TABLE `t_s_depart` (......
添加语句
LOCK TABLES `t_s_depart` WRITE;
INSERT INTO .....

现在的问题是,运行下面代码后没有什么反映,数据库t_s_depart表没录入数据  java运行也没异常
但是我自己运行cmd命令,然后执行cmdarray 里的三句话就可以给t_s_depart表录入数据。
但是java里试了一下午 试了好多方法,也都没好;求指导

String[] cmdarray = new String[] {"mysql -uroot -psql -hlocalhost -P3306","use pcyjxt1","source D:/MySQl/t_s_depart.sql" };
try {
Runtime runtime = Runtime.getRuntime();
//因为在命令窗口进行mysql数据库的导入一般分三步走,所以所执行的命令将以字符串数组的形式出现
String cmdarray[] = commands;//根据属性文件的配置获取数据库导入所需的命令,组成一个数组

Process process = runtime.exec(cmdarray[0]);
//执行了第一条命令以后已经登录到mysql了,所以之后就是利用mysql的命令窗口
//进程执行后面的代码
OutputStream os = process.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(os);
//执行命令1和命令2
writer.write(cmdarray[1] + "\r\n" + cmdarray[2]);
writer.flush();
writer.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
}

------解决方案--------------------
不好意思,我数据库学得不好,可能帮不了你,我只说我疑问的几点:

首先:你给 cmdarray 已经赋值了,但是在try块里面,你又将commands赋值给了 cmdarray ,不知道这个commands是什么;
其次,看你数据库里面的某些操作加锁了,加锁的话有些东西应该被注意:
http://blog.chinaunix.net/uid-21505614-id-289450.html
------解决方案--------------------
要处理Process对象的 getInputStream() 和 getErrorStream(),不然会阻塞住进程。

可以另外开一条线程负责这两个InputStream的读取和输出动作。