Oracle11gバックエンドを備えたレガシーPowerBuilder12.1Classicアプリケーションがあり、テスト環境では再現できない本番環境でのパフォーマンスの問題が発生しています。
問題のウィンドウには、グリッド/フリーフォームのデータウィンドウと他の応答ウィンドウを開くためのボタンがあり、閉じるとグリッドが再取得されます。
グリッドの背後には非常にコストのかかるクエリがあり、いくつかの列は、非常に強力なSQLを含む関数呼び出しから値を受け取りますが、本番環境でも数秒以内に実行されます。
エラーが発生したときの唯一の一貫性は、他のウィンドウにすばやく移動しようとした場合に発生する可能性が高いように見えることです。上記のウィンドウを開くボタンは、特定のインスタンス変数がグリッド内のフォーカスされている行からの適切な値で設定されていることを前提としています。ただし、このシナリオでは、行フォーカスの変更が発生したように見えても、インスタンス変数はまだ設定されていません。これにより、発生してはならないnull参照例外が発生します。
エンドユーザーのネットワーク接続はしばしば低速であり、彼らのハードウェアは私たちよりも能力が劣っていません。ネットワークのせいにしたいのですが、SQLを意図的に遅くしてボタンをクリックできるようにすることで、開発中にこれを自分で再現しようとしましたが、すべてが期待どおりに行われました。ボタンのクリックは、取得してから他のすべてのイベントは終了しました。
私の腸は、何らかの理由で物事が必要なときに同期して実行されていないことを教えてくれます。私が想像できる唯一の要因は、クエリが遅いかネットワークが遅いかにかかわらず、SQLの速度ですが、再現しようとしたときその効果はまだ適切な順序で起こった。唯一の疑わしいコードは、データウィンドウの祖先がue_post_rfc
から呼び出されたユーザーイベントを投稿しrowfocuschanged
、このイベントがを実行することYield()
です。 ue_post_rfc
の代わりにコードが入る場所ですrowfocuschanged
。
Yield()
SQLが人為的に遅くなった場合でも、テスト環境に現れることなく、これらの問題を引き起こす方法はありますか?