on 11-14-2008 7:20 AM
お世話になっております。
このフォーラムにて同じ質問がありまして内容を拝見致しましたが
明確な原因が判明していないようでしたので再度質問させていただきます。
以下の環境でアプリケーションを実行するとある特定の件数で
「レポートのロードに失敗しました」が発生します。(再現性100%)
<環境>
WindowsXP SP2
Visual Basic.NET 2003
ACCESS2003
IBM Rational Robot
帳票出力先はMicrosoft Office Document Image Writer
<画面説明>
VB.NETで作成した画面でデータ入力を行い、その内容を
データベースに書き込みレポートをロードし帳票を印字している。
<動作説明>
Rational Robotを使用し画面を自動で操作し、連続して帳票を
出力している。
つまり、データ入力u21D2印刷u21D2データ入力u21D2印刷・・・の繰り返し
上記操作を行うと247件目で「レポートのロードに失敗しました」が
発生します。
画面は複数ありA画面では発生するがB画面では発生しません。
5画面試して発生したのは2画面のみです。(これは325件目で発生)
画面の差異は入力項目数が異なるだけで印刷部分の処理は
共通関数を使ってます。
<ロジック>
'レポートファイル(.rpt)のパス名を取得
Dim strRptFile As String 'レポートファイル名(フルパス)
Dim tempReport As New CrystalReport1
Dim iCnt As Short
strRptFile=XXXX.rpt
tempReport.FileName = strRptFile
For iCnt = 0 To tempReport.Database.Tables.Count - 1
tempReport.Database.Tables.Item(iCnt).Location = gstrLclMDB
Next
tempReport.PrintToPrinter(1, True, 0, 0)
・
・
tempReport.Close() u2190CLOSEはちゃんと行ってます。
上記ロジックではdisposeを行っておりませんがDisposeを入れても
結果は同じでした。
<調査>
以下の調査を実施
①プリンタ先をOffice Image・・ではなくAdobe PDFに変更・・・事象発生
②プリンタ先をImageではなく紙に変更・・・事象発生
③ROBOTを使用せずに画面のみで実行(プリンタ先はImage)・・・295件目で発生
④ROBOTを使用せずに画面のみで実行(プリンタ先は紙)・・・800件でも発生せず
上記結果よりプリンタがImageの場合かRobotを使用した場合、発生することが判明。
ちなみにパフォーマンスモニタでメモリ、CPUの状態を見ましたが一番異常値が
出ていたのは事象が発生しない上記④でした。
気になった数値としてはPrivilegedTimeがTotal User Timeの150%から200%に
なっていましたが(適正値は15%)上記④は200%ぐらいだったので問題ないのかな
という感覚です。
原因特定が難しいのですが「レポートのロードに失敗しました」が発生する
要因として何が考えられるのでしょうか?
・存在しないレポートをロードした場合
・レポートのロードを行ったあと、CLOSEを行わずに連続してロードした場合
の2件は今回は該当しません。
あとオブジェクトの開放が行われているかですがVB.NETは意識しなくても
オブジェクトの開放は標準機能で行われているとありましたので問題ない
と思ってます。
ご教授宜しくお願い致します。
toshihiro hirata 様、
>上記結果よりプリンタがImageの場合かRobotを使用した場合、発生することが判明。
となっている以上、Crystal Reports 側の問題と仮定するのは難しいですべ。Crystal Reports ではプリンタドライバが Adobe Acrobat や Microsoft XPS のような仮想プリンタなのか、通常のプリンタなのかは全く意識していません。Acrobat の場合は Reader を単独で使っているだけでも、プロセスが残ったりする事はよくあることですから Acrobat 側の問題の可能性が高いと思います。
レポートがロードできない問題の原因も千差万別なのですが、この場合はプリンタドライバ自身が利用しているメモリーが開放されずに問題を起こしていると思われます。CLOSE ではなく、レポートのオブジェクト自身を破棄してみてください。呼び出し側のレポートオブジェクトが居なくなる事でプリンタドライバ側も開放されるかもしれません。
残念ながら、Robot に関してはわかりません。Robot 利用時にしか発生しない問題は、Robot 側の制御に問題があると考えるのが自然ですね。
SCN フォーラムモデレーター
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
ご指摘ありがとうございます。
CLOSEのかわりにレポート自信のオブジェクトの破棄を試してみましたが結果は同じでした。
メモリについても500M増設して合計1Gで試してみましたが結果は同じ247件目でエラーが発生します。
あとアプリケーション・ヒープ不足エラーというのをネットで見かけましたので下記文献にあるように拡張して試しましたが結果は同じでした。
http://www.atmarkit.co.jp/fwin2k/win2ktips/071desktopheap/desktopheap.html
ということはメモリ関連ではないのかな?と思ってます。
私も最初に疑ったところ(何かがオブジェクトを開放してない)でしたが・・・
ちなみにパフォーマンスモニタで実行中のデータを取る限りではメモリ不足にはなって
いないようです。
あと下記のパターンで1回だけ発生していることが確認されてます。
OS、画面は全く同じ環境でプリンタ紙出力のパターン。
尚、この端末にはROBOTはインストールされてません。
ちなみにプリンタはIBM Infoprint 1336J RPCS
つまりROBOTも使用せずにプリンタもイメージでなく紙への出力です。
入力はオペレータが行ってます。
発生頻度は約2年間で1回です(ほぼ毎日使用してる画面です)
※レポート自信の破棄ですが
Dim tempReport As New CrystalReport1
・
・
tempReport.Dispose
と認識しておりますが間違ってないですよね。
11/20追記
プリンタドライバに問題があるのかどうかを調べるため以下を試してみました。
tempReport.PrintToPrinter(1, True, 0, 0) の部分をコメントにしてプリンタには
出力せずに繰り返し処理を行った場合。
結果は308件目でレポートロードエラーが発生しました。
ということでプリンタドライバ自身が利用しているメモリーが開放されずに問題を起こしている?
の可能性は低くなったと思われます。
Edited by: toshihiro hirata on Nov 20, 2008 5:10 AM
>発生頻度は約2年間で1回です(ほぼ毎日使用してる画面です)
エラーの原因は色々あるので、1 回だけ発生したものは別の原因と考えたほうが良いかと思います。
>tempReport.Dispose
>と認識しておりますが間違ってないですよね。
Dispose の上で、オブジェクトの参照を破棄して、新たに New を行うようにしてみてください。過去には Dispose だけでは解決できなかったエラーが、廃棄 u2192 New で改善した例がかなりあります。
New u2192 ロード u2192 Viewer 表示 u2192 ボタンクリック u2192 ReportSource = nothing u2192 破棄 u2192 nothing を繰り替えす簡単なプログラムを作成し、400 回以上動作させましたが問題はありませんでした。
ProcessExplorer で Virtual Size を確認しながらでしたが、増減を繰り返す(340 ~ 360M 程度)だけで大きなメモリーリークもありませんでした。
SCN フォーラムモデレーター
>ほかに何かご助言等ございましたらお願いします。
現在も ROBOT 利用時のみに発生しているのですよね。利用していない環境での再現性が確認できなければこれ以上の調査は難しいですね。
>ということでプリンタドライバ自身が利用しているメモリーが開放されずに問題を起こしている?
の可能性は低くなったと思われます。
レポートのプリンタ設定は「プリンタなし」ではなく、Document Writer が指定されていますか?
その場合、印刷処理を行わなくてもプリンタの情報は取りに行くので、影響が無いとは言い切れません。
あと、他のプリンタドライバ(HP, EPSON, CANON など)で発生するかを確認してみてください。
SCN フォーラムモデレーター
返信ありがとうございます。
ROBOTを使用しない状態では再現性はかなり低いですが発生はしております。
VB.NETの画面だけで2000回まわすようにして動作させたら1800件目付近で
レポートロードエラーが発生しました。(2回やって1回発生という頻度です)
プリンタドライバを他社にかえて試すという方法ですが現在IBM社のプリンタしか
なく、試せません。
ロードエラーが発生するのは仕方ないのでエラー発生時VB.NET側でリトライして
回避させようと試みたのですがダメでした。(連続でエラーとなってしまう)
エラーが発生する件数はわかっているので件数制限で運用してもらうように
お客様にお願いすることになりそうです。
更新が無い為、Answered に変更させていただきます。
SCN フォーラムモデレーター
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
1件だけ過去のケースで ROBOT が関連するものがありました。厳密に言えば、ROBOT を使うことで問題を早く発生させているので、今回の問題に似ていると思われます。
その問題は ASP.NET でしたが、この問題に関しては VB.NET とだけ書いてあるだけで、WinForm か WebForm かがわかりませんので該当しない可能性もあります。
そのケースでは 32bit の限界である 2G のメモリーをスレッドで使い切ってしまっていました。これは Crystal Reports のメモリーリーク ではなく ASP.NET の Cache によるものでしたので、Crystal Reports 側では何の対応もせず、ユーザーのアプリケーションで積極的に Cache の破棄を行うように回答をしています。
もし、Cache を使用しているならば Session への変更を、Session を利用されている場合は、Session のタイムアウトを早めるか、意図的に Session の破棄を行ってみてください。
SCN フォーラムモデレーター
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
>いっそ、100 回毎にアプリケーションの再起動では駄目なのですか? ROBOT が前提で自動で回すだけであれば再起動自体が問題になることは無いように思えます。
200件区切りで処理を行っていただく(つまり再起動ということ)案をお客様に提示したのですが
それでは自動運用させている意味がないということで難色を示されました。
ではROBOT側で200件毎に自動でVB.NET側の画面を終了させて再度起動させてみてはどうかと
考えてみましたが制御がかなり難しく新たなバグを引き起こす可能性がありましたので止めました。
結論としては解決策がないので200件区切りで運用して頂く方向になりそうです。
尚、ROBOTの方は現在新バージョンへの移行に向けて作業中(来年頭の予定)ですので
新バージョンにて問題が解決したら報告したいと思います。
ありがとうございました。
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.