【发布时间】:2013-11-07 11:53:58
【问题描述】:
全部,
我最初有一个名为 SQLLoader(Oracles 数据上传工具)的 shell 脚本。
问题在于 SQLLoader 将纯文本密码作为输入,因此我决定构建一个 Java 应用程序以在内部调用 SQLLoader,并将解密的密码传递给命令字符串。
例如
sqlldr user/pass@DBServer control=../sqlloader.ctl log=sqlloader.log data=mydata.csv
所以使用我的 java 包装器,它在我的 shell 脚本中变成了这个
java -jar sqlloader.jar sqlloader.ctl mydata.csv
但是,当 SQLLoader 抱怨没有要加载的文件时,出现了一个新问题。经过一番摸索后,我发现我的 shell 脚本中的后续命令似乎正在执行,而我的 java 应用程序仍在运行。因此它的行为是异步的。
下一个命令是在 sqlloader 有机会使用它之前移动输入文件。所以我在 20 秒内输入了一个 sleep 命令,让我的 java 应用程序有时间运行。
java -jar sqlloader.jar sqlloader.ctl mydata.csv
echo $?
sleep 20
if [ $? -ne 0 ]
then
echo "SQLLoader failed during execution, please check the log : "
mv mydata.csv
else
echo "SQLLoader successfully processed file : "
mv mydata.csv
fi
有谁知道为什么 unix 会这样,Java 是否将我的 SQLLoader 作为不同的用户/线程执行?
这是我的java代码:
Runtime Rt;
Process Prc;
Prc = Rt.exec("sqlldr user/decryptedpass@DBServer control=../sqlloader.ctl log=sqlloader.log data=mydata.csv);
system.exit(0);
我检查了运行时类是否有任何关于它是异步的但找不到任何东西
http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html
有什么理论或建议吗?
谢谢
【问题讨论】:
-
执行后你在代码中做了什么?
-
system.exit(0);是我在 java 程序中的最后一行
-
这可能是题外话,但是......加密密码的意图是什么?您真的像示例代码一样在 Java String 中硬编码密码吗?如果是这样,黑客可以解压缩
jar文件并查看.class文件,密码将只是明文。 JavaRuntime.exec底层处理复杂,应该有更简单的方法。
标签: java shell asynchronous sql-loader