こんにちわ!本日は前回に引き続きCrystal Reportsで発生したちょっぴりホラーな現象についてお話ししたいと思います。前回の記事はこちらからご覧ください。
発生したエラー
私はプライベートでCrystal Reportsを利用して帳票をエクスポートできるシステムをIISでホストして運用しています。順調に動いていたのですが、ある日突然「レポートの読み込みに失敗しました(Failed to load report)」というエラーが発生するようになりました。エラーが起きると全てのクライアントで帳票エクスポートに失敗するのでかなり厄介な問題です。これは困ったな。。。
不可解な挙動
最初はエラー内容が分かっているのだから原因を調べてすぐ治せるはずと思っていました。しかしこのエラー、挙動がどうにもおかしいのです。具体的には
・システムが稼働してから早5年ほど。このエラーに遭遇したのは今年に入ってから。
・サーバー再起動 / IISリセットで一時的に直り、不定期で再発
プログラムに問題があるならもっと早い段階でこの種のエラーが起きていたはずです。まるで時限爆弾のように今になって問題が起き始めるとは。こうなると考えられる原因は2つ。裏側でなんらかのデータが溜まっており、一定限度を超えると爆発している。あるいは霊的な何かによる仕業です(笑)。今回は前者が原因であるとの仮定のもと解決を試みました。
読みは当たっていた
レポート読み込みエラーの原因は数あれど、代表的なものはreportオブジェクトを破棄する処理を忘れていることですが前述の通り5年間何事もなく動いたシステムには無関係そうです。他にはどんな原因があるか探ってみると、「Crystal Reportsは帳票の一時ファイルを自動生成し、それを消さない」なるけしからん情報を発見。しかも一時ファイルが一定限度を超えると動作に支障が生じレポート読み込みエラーを吐くことがあるそうです。
絶対これやん。。。
大量の一時ファイル
サーバーへアクセスしてTempフォルダーを開いてみました。そこには5年間の運用で溜まりに溜まった帳票関連の一時ファイルが約5,000件残されていました。容量にして2GB強。各ファイルサイズはそこまで大きくはないもののちりも積もればですね。
中身をざっと見た限り全てのファイルが残っているわけではないようで、ごく稀に一時ファイルを消し漏れているようです。この不安定さがこの問題をややこしくしている気がします。今後エラーが起きないように全ての一時ファイルを消去しました。
まとめ
今回はCrystal Reportsで発生した一見不可解なエラーの対処法をご紹介しました。必ずしもこれで解決できる保証はありませんが私の環境では一時ファイルをお掃除してから1か月ほどたちますが件のエラーには遭遇していません。もし再発した場合はご報告させて頂きます。
この記事が面白かった方、参考になった方は、是非「イイね」お願いします。