- PR -

ASPNET_WP.exeが突然再起動される。

投稿者投稿内容
s15spr
会議室デビュー日: 2006/01/17
投稿数: 10
投稿日時: 2006-03-18 14:37
お世話になります。

環境
OS:Windows 2000 Server SP3
VB:VisualStudio.NET 2003(VB.NET、ASP.NET)
.NET FrameWork1.1(SPなし)
DB:PostgreSQL8.1

上記の環境でWebシステムを作成しているのですが、
ASPNET_WP.exeのメモリが40MB〜50MBを消費した時点で再起動されてしまいます。

その際、サーバのイベントログには必ず以下の2種類が書き込まれます。

1.COM+のエラー
  種類   :エラー
  ソース  :COM+
  分類   :SVC
  イベントID:4194
  内容   :システムがカスタム コンポーネントを呼び出しましたが、そのコンポーネン
        トは失敗して例外が生成されました。これはカスタム コンポーネントに問題
        があることを示しています。このコンポーネントの開発者にエラーが発生した
        ことを通知し、以下の情報を提供してください。
        コンポーネントの Prog ID: 0[ODBC][Env 4f912a0]
        メソッド名: IDispenserDriver::CreateResource
        プロセス名: aspnet_wp.exe
        このエラーが深刻であるため、プロセスを終了します。
        例外: C0000005
        アドレス: 0x1002EDAF
        呼び出しスタック:
        psqlodbcw + 0x2EDAF

2.COM+のエラー
  種類   :エラー
  ソース  :ASP.NET 1.1.4322.0
  分類   :なし
  イベントID:1000
  内容   :aspnet_wp.exe (PID: 688) stopped unexpectedly.

psqlodbcw(PostgreSQLのODBCコンポーネント)でエラーとなっていたため、
最新版の8.1.3にバージョンアップしましたが結果は同じでした。

メモリ消費でのaspnet_wp.exeを避けたかったため、Machine.ConfigのSessionStateの
MemoryLimitは80に設定してあり、サーバ全体の消費率をみてもそこまで至っていません。

まったく原因が分からないので、どなたか教えていただけませんか?
s15spr
会議室デビュー日: 2006/01/17
投稿数: 10
投稿日時: 2006-03-18 14:46
自己レスです。
間違えた部分を修正します。

誤:2.COM+のエラー
正:2.aspnet_wp.exeのエラー

誤:メモリ消費でのaspnet_wp.exeを避けたかったため(以下略)
正:メモリ消費でのaspnet_wp.exe再起動を避けたかったため(以下略)

よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-03-18 21:06
引用:

s15sprさんの書き込み(2006-03-18 14:37)より:

メモリ消費でのaspnet_wp.exe再起動を避けたかったため、Machine.ConfigのSessionStateの
MemoryLimitは80に設定してあり、サーバ全体の消費率をみてもそこまで至っていません。


いや、まず、なぜ psqlodbcw(PostgreSQLのODBCコンポーネント)でエラーとなっているか、それが先でしょ。
引用:

  内容   :システムがカスタム コンポーネントを呼び出しましたが、そのコンポーネン
        トは失敗して例外が生成されました。これはカスタム コンポーネントに問題
        があることを示しています。このコンポーネントの開発者にエラーが発生した
        ことを通知し、以下の情報を提供してください。
        コンポーネントの Prog ID: 0[ODBC][Env 4f912a0]
        メソッド名: IDispenserDriver::CreateResource
        プロセス名: aspnet_wp.exe
        このエラーが深刻であるため、プロセスを終了します。


どこにも aspnet_wp.exe が確保したメモリが大きくなったなんて、書いてないですよね。

 あ、CreateResource ?リソースとメモリは別のものです
 おおかた、接続を閉じていないとかじゃないですかね?使う直前で開いて、使い終わったら即閉じる。これが基本です。Try 〜 Finally ブロックを使って、確実に閉じられるようにしましょう。

ご参考
ASP.NETでInProcを使ってはいけない
COM オブジェクトを解放する
 COM オブジェクトを DbConnection などに置き換えて考える

〆 written by Jitta@わんくま同盟 on 2006/03/18
□ Microsoft MVP for Visual Developer ASP/ASP.NET October, 2005 - September, 2006
s15spr
会議室デビュー日: 2006/01/17
投稿数: 10
投稿日時: 2006-03-20 08:55
Jittaさん回答ありがとうございます。

NO2のエラーの対象は分かっていたのですが、なにが起因して起こっているのか
分からなかったため協力をお願いした次第です。

ご指示をいただいた部分のチェックを行ってみます。

ありがとうございました。
s15spr
会議室デビュー日: 2006/01/17
投稿数: 10
投稿日時: 2006-03-21 10:10
お世話になります。

結果が出たので報告させていただきます。

ソースをレビューしてみると、オブジェクトの開放(DATASET、ODBC)が不足している
ところが多々あったので、すべてDisposeすることで対処しました。

以前よりかなり安定するようになったのですが、それでも上記のエラーが発生しました。
ODBC接続で利用しているのは「PostgreSQL UNICODE」でしたが、「PostgreSQL ANSI」
にしたところ、まったくエラーが発生しなくなりました。

以前は「PostgreSQL UNICODE」で運用していて問題がなかったのですが不思議です。
得られる結果と更新した結果が以前と変わらないためそのまま進めようと思います。

時間があれば調べてみたいと思います。

以上報告でした。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-03-21 12:38
引用:

ODBC接続で利用しているのは「PostgreSQL UNICODE」でしたが、「PostgreSQL ANSI」
にしたところ、まったくエラーが発生しなくなりました。

以前は「PostgreSQL UNICODE」で運用していて問題がなかったのですが不思議です。



ひょっとしてですが、今回扱うデータの中に UNICODE/MBCS 変換に失敗する文字が含まれているとか?

そうすると、かなり把握しにくいところにストレスが溜まっても不思議は無いかもしれません。
s15spr
会議室デビュー日: 2006/01/17
投稿数: 10
投稿日時: 2006-03-21 17:25
渋木宏明(ひどり)さん回答ありがとうございます。

UNICODE/MBCS変換で失敗する文字ということですが、
すみません、ちょっと見当がつきません。(MBCS:マルチバイト文字ですよね?)

現状としては、エラー発生有ソース/エラー発生無ソースどちらも同じデータを
利用しており、どちらもODBCはPostgreSQL UNICODEでした。

エラー発生有ソースについては「ODBCをPostgreSQL UNICODEからPostgreSQL ANSIに
切り替えた」という今までのレスの流れとなります。

明確な回答ができず、申し訳ありません。

よろしければこの部分を教えていただけないでしょうか?
>UNICODE/MBCS変換で失敗する文字ということですが、

渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-03-21 20:46
引用:

UNICODE/MBCS変換で失敗する文字ということですが、
すみません、ちょっと見当がつきません。(MBCS:マルチバイト文字ですよね?)



具体的な文字コードに心当たりがあるわけではありません。

要旨は、char, varchar, text 型などのフィールドに、Unicode ←→ ANSI/MBCS 変換に失敗する文字(コード)が含まれているのではないか?ということです。

ざっくり言っても

・DBMS が媒体への記録に使用する文字コード
・DBMS が送受信に使用する文字コード
・アプリケーションがデータプロバイダとの情報交換に使用する文字コード

という具合に、各層の文字コードの体系が異なる可能性があります。
(もっと多段の場合もあるでしょう)

文字コードの体系が異なるのであれば、「変換」という作業が不可避です。

データプロバイダに固有のバグが無いのであれば、

引用:

ODBC接続で利用しているのは「PostgreSQL UNICODE」でしたが、「PostgreSQL ANSI」
にしたところ、まったくエラーが発生しなくなりました。



という状況から、どこかの文字コード変換処理で問題が発生しているのではないか、と考えた次第です。

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