全て、
私はもともと、SQLLoader (Oracles データ アップロード ツール) を呼び出すシェル スクリプトを持っていました。
問題は、SQLLoader がプレーン テキストのパスワードを入力として受け取ることでした。そのため、復号化されたパスワードをコマンド文字列に渡して内部的に SQLLoader を呼び出す Java アプリケーションを作成することにしました。
例えば
sqlldr user/pass@DBServer control=../sqlloader.ctl ログ=sqlloader.log データ=mydata.csv
したがって、私のJavaラッパーでは、シェルスクリプトでこれになりました
java -jar sqlloader.jar sqlloader.ctl mydata.csv
しかし、ロードするファイルがないと SQLLoader が訴えると、新たな問題が発生しました。頭を悩ませた後、Java アプリケーションがまだ実行されている間に、シェル スクリプトの後続のコマンドが実行されているように見えることがわかりました。したがって、非同期で動作していました。
次のコマンドは、sqlloader が使用する機会を得る前に、使用していた入力ファイルを移動することでした。そこで、20 秒以内にスリープ コマンドを実行して、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
理論や提案はありますか?
ありがとう