C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: C#からSQL*Loaderの呼び出しで・・・


(過去ログ 15 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■5280 / inTopicNo.1)  C#からSQL*Loaderの呼び出しで・・・
  
□投稿者/ くりどら (1回)-(2007/07/09(Mon) 15:16:18)

分類:[C#] 

こんにちは。

OracleDB(10g)へデータを取り込むために、
C#からSQL*LOADERを使用してデータを登録してます。

コードは下記のようになっています。
===============================================
public static void ProcStart( )
{
ProcessStartInfo hProcess = new ProcessStartInfo( ) ;

hProcess.FileName = @"sqlldr.exe";
hProcess.Arguments = @"ユーザ/パス@サービス名 control=D:\\コントロール.ctl log=d:\\logfile.log";
hProcess.RedirectStandardInput = false ;
hProcess.RedirectStandardOutput = true ;
hProcess.UseShellExecute = false ;
hProcess.CreateNoWindow = true ;

// プロセス起動
Process Pro = Process.Start(hProcess) ;

// 終了まで待機
Pro.WaitForExit( ) ;

return;
}
===============================================
少ないデータだと特に問題はなかったのですが、
今回少し大きめのデータ(と言っても20000行程度)を登録しようとしたときに、
SQL*LOADERが固まっているようなのです。(insert途中なのにCPU使用率0%でデータが登録できてない)

現象としては
@途中まで登録でき、何回か試しても同じ行で止まってしまう。
ASQL*LOADERの起動元プロセスをタスクマネージャで終了させると続きが実行される。
BC#からではなく、コマンドプロンプトより実行すると全く問題なく終わる。
C20000行だと途中で止まるが、5000行ずつ4回に分けると登録できる。

@の現象からデータの問題も考えたのですが、Cを考えるとデータの問題ではなさそうです。
Aの現象からSQL*LOADERが悪いわけではなく、C#側に問題があるのかと思ったのですが
検討がつきませんでした。
ご存知の方、もしくは思い当たることがありましたら、
ご教示お願いいたします。

引用返信 編集キー/
■5295 / inTopicNo.2)  Re[1]: C#からSQL*Loaderの呼び出しで・・・
□投稿者/ じゃかるた (41回)-(2007/07/10(Tue) 00:31:08)
No5280 (くりどら さん) に返信
ロールバック領域不足では?

引用返信 編集キー/
■5306 / inTopicNo.3)  Re[2]: C#からSQL*Loaderの呼び出しで・・・
□投稿者/ くりどら (2回)-(2007/07/10(Tue) 11:56:57)
No5295 (じゃかるた さん) に返信
> ■No5280 (くりどら さん) に返信
> ロールバック領域不足では?
>

返信ありがとうございます。

C#からではなく、コマンドプロンプトよりコマンドでSQL*LOADERを起動すれば
この現象は発生しないのでロールバック領域が足りないことは
考えられないと思います。
LOADERで取り込んだときに数百行単位でコミットも行われているようです。
引用返信 編集キー/
■5307 / inTopicNo.4)  Re[3]: C#からSQL*Loaderの呼び出しで・・・
□投稿者/ くりどら (3回)-(2007/07/10(Tue) 12:01:23)
度々申し訳ありません。

上記コードで
======================
// 終了まで待機
Pro.WaitForExit( ) ;
======================
の部分をコメントアウトすると
LOADERは途中で止まることなく最後までデータをInsertしてくれます。

WaitForExit() を有効にしておくと必ず毎回同じ行数をInsertしたところで
LOADERが停止してしまいます。
そこでLOADERを起動しているC#側のプロセスをタスクマネージャで終了させると
またLOADERが続きの行をInsertして終了します。

う〜ん・・・Pro.WaitForExit( )で何か起きているようなのですが
なかなか糸口が掴めません。
引き続き情報をお待ちしております。
引用返信 編集キー/
■5313 / inTopicNo.5)  Re[4]: C#からSQL*Loaderの呼び出しで・・・
□投稿者/ HiJun (54回)-(2007/07/10(Tue) 12:33:02)
SqlLoaderの起動処理を行うBATファイルを作成して
そのバッチファイルが終わるまで見てみてはいかがですか?
引用返信 編集キー/
■5324 / inTopicNo.6)  Re[5]: C#からSQL*Loaderの呼び出しで・・・
□投稿者/ くりどら (4回)-(2007/07/10(Tue) 16:02:29)
HiJunさん ありがとうございます。

バッチファイルで、前試したのですが上記現象と同じ結果となりました。
ただ念のため下記の3パターンのバッチファイルを作成し、
C#から実行してみたところ

@普通?     【sqlldr.exe ユーザ/パス@サービス名 control=D:\コントロール.ctl log=d:\logfile.log】
Aリダイレクト付加【sqlldr.exe ユーザ/パス@サービス名 control=D:\コントロール.ctl log=d:\logfile.log > D:\result.log】
Bスタート付加  【start sqlldr.exe ユーザ/パス@サービス名 control=D:\コントロール.ctl log=d:\logfile.log】

この結果
@は私が最初に投稿した途中でLOADERが止まる現象と同じことが発生。
Aは唯一問題なく出来ました。
BはInsertはOKだったのですが、C#側がバッチファイルの終了を待たないで次の処理に行ってしまい失敗。

となりました。
Aのバッチファイルを作成し、そのバッチファイルを起動することで問題はありませんが、
なぜこのような結果になるのかが気になります。

個人的に気になるので、この結果を踏まえバッチファイルを使用せずにC#側で処理する方法をもう少し調査しようと思います。
引き続き情報をお待ちしております。
引用返信 編集キー/
■5325 / inTopicNo.7)  Re[6]: C#からSQL*Loaderの呼び出しで・・・
□投稿者/ 魔界の仮面弁士 (335回)-(2007/07/10(Tue) 16:41:23)
# 回答に非ず。

No5324 (くりどら さん) に返信
> なぜこのような結果になるのかが気になります。

下記 2004-11-04 の投稿に、標準出力を受け取る際のバッファサイズに関する話題がありました。
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list118.shtml


.NET 系の話ではないので、今回の件には該当しない可能性もありますが、曰く、
バッファが溢れると、それ以上の書き込みがブロックされてしまう、という現象が起きうるらしいので、
今回、それと同様のことが起きていたのかな……? と想像してみました。未検証。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -