0

従来の Notes 開発から、データベースやビューなどの Domino オブジェクトをスクリプトで取得することは効果的ではなく、ループ内では避けるべきであることがわかりました。

XPages では、Domino オブジェクトをシリアライズできず、多くの場合、同じオブジェクトを何度も取得します。プロジェクト関連のドキュメントに保存されているプロジェクト番号に基づいて、プロジェクト データを取得する例があります。Bean のスコープapplicationScopeが設定され、結果がキャッシュされます。

public class Projects{ 
      private TreeMap<String, Project> projectList; 

      public Projects() { 

      } 

      public Project getProjectInfo(String projNum) { 
              Project project = null; 
              if (projectList==null) { 
                      projectList = new TreeMap<String,Project>(); 
              } 

              if (projectList.containsKey(projNum)) { 
                      project = projectList.get(projNum); 
              } else { 
                      try { 
                              Database projDb = DominoAccess.getDatabase("projects"); 
                              View v = projDb.getView("(projLookup)"); 
                              ViewEntry ve = v.getEntryByKey(projNum); 
                              if (ve != null) { 
                                      project = new Project(ve); 

                                      projectList.put(projNum, project); 
                              } 
                      } catch (Exception e) { 
                      } 
              } 

              return project; 
      } 
}

これが最初に繰り返し使用される場合、各ドキュメントに対してデータベースとビューオブジェクトが作成されます。これはベストプラクティスですか、それともこれを解決するより良い方法はありますか?

最初の使用時にすべてのプロジェクトをマップに配置できることはわかっていますが、これがメモリに関するベスト プラクティスであるかどうかもわかりません。

4

1 に答える 1

0

これを繰り返しコントロール (たとえば 30 回) で使用する場合は、30x の @DBLookup を使用します。それはあまり効率的ではないようです。できること: ビュー ナビゲータを使用して、id と unid を持つすべてのプロジェクトをすばやくマップに読み込みます。次に、@DBLookup を実行する代わりに、マップから UNID を取得し、getDocumentByUNID を実行してロードします。その方が速いはずです。別のバリエーション - プロジェクト データが大きすぎない場合: JSON 表現をフィールドに保存し、それをビュー ナビゲーターに配置します。この方法では、ビューを読み取るだけで済みます (ここでも、順次読み取りまたは検索の 2 つのバリエーションがあります) とフィールドを読み取る必要があります。

さらに明確にする必要がある場合はお知らせください

于 2013-04-26T06:38:06.910 に答える