Oracle Data Relationship Managementエンジンはマルチスレッド化された、複数マシンの環境で、スクリプトは複数のスレッドでマシン全体にわたって同時に実行されます。値を作成してグローバル・スコープに格納できますが、別のスレッドでスクリプトが実行される場合にはそのグローバル値が存在しないため、この動作に依存することはお薦めできません。同様に、Data Relationship Managementエンジンのインスタンスやマシン全体でグローバル値が更新されるわけではありません。さらに、Data Relationship Managementでは、複数のライブ・バージョンがサポートされているため、ノードの値の計算やその値をグローバル・スコープに格納することに依存していると、別のスクリプトが他のノードのプロパティにアクセスした場合には、誤った値が生成されます。
注:
変数をグローバル・スコープに格納しないことと同じ理由で、すべてのエンジン・インスタンスおよびスレッド全体に変更が行われたことを確認できないため、組込みのData Relationship Managementオブジェクト・プロトタイプも変更しないことをお薦めします。
スクリプト・タイムアウトの設定
エンジンが過度にロックされないよう、値を戻さずに長時間実行されるスクリプトは、タイムアウト設定に基づいて終了されます。スクリプト・タイムアウトは、プロパティ定義および検証ごとに設定できます。
タイムアウトは実行コンテキストごとにであるため、エクスポートで100ノードのスクリプト・プロパティをエクスポートしていて、そのプロパティのタイムアウトが30秒に設定されている場合、各ノードでのプロパティの検証に30秒かかるため、そのエクスポートには最大50分かかります。ただし、スクリプト・プロパティで別のスクリプト・プロパティが呼び出される場合には、タイムアウトは増加しません。たとえば、PropAのタイムアウトが10秒、PropBのタイムアウトが20秒で、長時間の計算を開始するPropBをPropAが呼び出した場合、10秒が経過すると、元のタイムアウトが過ぎているためPropAの検証は終了します。
無限ループの防止
無限ループ(スタック・オーバーフローとも呼ばれる)に陥るスクリプトは、サーバー・プロセスが予期せず終了する原因となる重大なエラーです。Data Relationship Managementはそのようなスクリプトが実行されないよう試みますが、自己参照を行うスクリプトや再帰的なスクリプトを記述する際には注意が必要です。本番環境にデプロイする前に、開発環境で必ず新しいスクリプトをテストしてください。
無限にループするスクリプトの簡単な例を次に示します。スクリプトにそのスクリプト自体の呼出しが含まれていますが、実行が終了されないため、関数を実行しているエンジンが、最終的にリソース不足で停止します。最後に、スクリプトではData Relationship Managementエンジンが呼び出されないため、オーバーフローを捕捉してスクリプトを停止する機会がありません。
function badFunc(a) { badFunc(a); }
badFunc("oops");
パフォーマンスに関する考慮事項
最適なパフォーマンスを実現するため、式から派生したプロパティとスクリプトの間で相互に参照することは回避してください。一般的にスクリプトは、64ビット・プロセッサを含むネイティブ・ハードウェアのJust-In-Time (JIT)コンパイルなどの考慮事項のため、式と比較して、パフォーマンス・チューニングの最適化の非常によい機会です。また、スクリプトは、実際の実行特性に合せてJITコンパイラによりチューニングされるため、時間の経過とともにより短時間で実行されるようになります。