- PR -

高負荷時のテキストファイル書き込みで例外が発生する

投稿者投稿内容
未記入
会議室デビュー日: 2006/01/31
投稿数: 4
投稿日時: 2006-01-31 02:17
お世話になります。

C#.NETで作成したDB登録モジュール(.exe)を実行することにより、
DB(SQLServer2000)に3000件のCSVレコードをCSV1レコードにつき1回SQL文を発行してINSERT又はUPDATEしています(都合によりBCPは使用できません)。この際、SQL発行の前後でテキストファイルにログ出力(ログ出力専用クラスのstaticメソッドでテキストファイルに出力)しているのですが、4000件以上のCSVレコードを処理しようとすると以下の例外が発生します。

「オブジェクト参照がオブジェクト インスタンスに設定されていません」

1000件程度ならこの例外は発生せずに、上記モジュール実行で正常終了します。
件数に関係なく正常終了させたいのですが、上記例外を回避する方法はありますで
しょうか。ご存知の方がいましたら、是非ご教授願います。

※実行環境
OS:Windows2000ServerSp3
メモリ:1GB
HDD構成:RAID-5
.NET Framework 1.1
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-31 02:29
引用:

未記入さんの書き込み (2006-01-31 02:17) より:

「オブジェクト参照がオブジェクト インスタンスに設定されていません」


この例外は、"どれ" に対して発生していますか?
それと、static メソッドに不具合がないのか、これだけの情報では判断できないです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
未記入
会議室デビュー日: 2006/01/31
投稿数: 4
投稿日時: 2006-01-31 10:16
じゃんぬねっとさんレスありがとうございます。

情報不足ですいませんでした。

1.staticメソッドに不具合はありません。

2.例外はログ出力をするstaticメソッド内で、
Mutexオブジェクトをnewする際に例が発生しています。

ソースの抜粋を以下に示します。
このロジックが数千回繰り返された場合に例外が発生します。



// iniファイルからログ出力フォルダを取得
m_strTrcLogPath = MtnetUtil.GetStringValue(MtnetConst.SECTION_PATH ,MtnetConst.TRACE_LOGFILE_PATH ,"");


//排他制御 → 【ここで例外が発生します】
Mutex objMutex = new Mutex(bolOwnership, strLogName, out bolCreatedNew);



//ログ出力
fsFileStream = new FileStream(m_strFullFileName,FileMode.Append);
swStreamWriter = new StreamWriter(fsFileStream,System.Text.Encoding.GetEncoding("shift-jis"));
swStreamWriter.WriteLine(sbLogText.ToString());
swStreamWriter.Close();
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-31 10:40
引用:

未記入さんの書き込み (2006-01-31 10:16) より:

このロジックが数千回繰り返された場合に例外が発生します。


Mutex の解放ってどうやってるんですか?

高負荷にならないように、スレッドを一時的に休止するなどしてテストする必要もあるでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
未記入
会議室デビュー日: 2006/01/31
投稿数: 4
投稿日時: 2006-01-31 10:43
Mutexの解放は、ログ出力メソッドのfinally句で
以下のように行っています。

if (!objMutex == null)
{
objMutex.ReleaseMutex();
objMutex.Close();
objMutex = null;
}

囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-01-31 11:05
ん?
if (!objMutex == null)
それはコンパイルできます?
_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-31 11:52
引用:

囚人さんの書き込み (2006-01-31 11:05) より:

それはコンパイルできます?


転記ミスかな。(コピペして下されば良いのに)
if (objMutex != null) ですね。

とりあえず、高負荷にならないようにテストして検証して欲しいですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-01-31 21:44
 何のために Mutex を使っているのでしょう?排他処理なら、 Mutex よりファイルの排他処理でいいのでは?

 また、Mutex を new する行で発生しているなら、objMutex が null ではなく、コンストラクタの引数のどれかが null ってことですよね?


 ついでに、ハンガリアン記法もねぇ。。。

スキルアップ/キャリアアップ(JOB@IT)