0

常に同じドキュメント (カウンター ドキュメント) を取得し、現在の値を取得し、それをインクリメントして新しい値でドキュメントを保存する Bean を構築しようとしていました。最後に、呼び出し元のメソッドに値を返す必要があります。これにより、Xpage で新しい連番が取得されます。

Domino オブジェクトはシリアル化またはシングルトン化できないため、まったく同じことを行う SSJS 関数を作成するよりも、これを行う Bean を作成する利点は何ですか?

私のビーンには、セッション、データベース、ビュー、およびドキュメントへの呼び出しが必要であり、それらは毎回呼び出されます。

セッションとデータベースを除いて、SSJS 関数内で同じです。

豆:

public double getTransNo() {
        try {
            Session session = ExtLibUtil.getCurrentSession();
            Database db = session.getCurrentDatabase();
            View view = db.getView("vCount");
            view.refresh();
            doc = view.getFirstDocument();
            transNo = doc.getItemValueDouble("count");
            doc.replaceItemValue("count", ++transNo);

            doc.save();
            doc.recycle();
            view.recycle();
        } catch (NotesException e) {
            e.printStackTrace();
        }

        return transNo;
    }

SSJS:

function getTransNo() {
    var view:NotesView = database.getView("vCount");
    var doc:NotesDocument = view.getFirstDocument();
    var transNo = doc.getItemValueDouble("count");
    doc.replaceItemValue("count", ++transNo);
    doc.save();
    doc.recycle();
    view.recycle();
    return transNo;     
}

ありがとうございました

4

1 に答える 1

3

どちらのコードも良くありません(率直に言って申し訳ありません)。
ビューに1つのドキュメントがある場合、別のビューの更新の後ろにキューに入れられて非常に遅くなる可能性があるビューの更新は必要ありません。おそらく、あなたは単一のサーバーソリューションについて話しているでしょう(カウンタードキュメントの複製は確かに競合につながるため)。

XPagesで行うことは、Javaクラスを作成し、それをアプリケーションBeanとして宣言することです。

  public class SequenceGenerator {
    // Error handling is missing in this class
    private double sequence = 0;
    private String docID;

    public SequenceGenerator() {
      // Here you load from the document
      Session session = ExtLibUtil.getCurrentSession();
      Database db = session.getCurrentDatabase();
      View view = db.getView("vCount");
      doc = view.getFirstDocument();
      this.sequence = doc.getItemValueDouble("count");
      this.docID = doc.getUniversalId();
      Utils.shred(doc, view); //Shred currenDatabase isn't a good idea
    }   

    public synchronized double getNextSequence() {
      return this.updateSequence();
    }

    private double updateSequence() {
       this.sequence++;
       // If speed if of essence I would spin out a new thread here
       Session session = ExtLibUtil.getCurrentSession();
       Database db = session.getCurrentDatabase();        
       doc = db.getDocumentByUnid(this.docID);
       doc.ReplaceItemValue("count", this.sequence);
       doc.save(true,true);
       Utils.shred(doc);
       // End of the candidate for a thread
       return this.sequence;
     }
 }

SSJSコードの問題:2人のユーザーが一緒にそれをヒットした場合はどうなりますか?少なくともsynchronizedそこでも使用する必要があります。Beanを使用すると、ELでもアクセスできるようになります(頻繁に呼び出さないように注意する必要があります)。また、Javaでは、書き込みを別のスレッドに延期することも、まったく書き戻さないこともできます。クラス初期化コードで、実際のドキュメントを含むビューを読み取り、そこから値を選択します。

更新:Utilsは静的メソッドを持つクラスです:

 /**
 * Get rid of all Notes objects
 * 
 * @param morituri = the one designated to die, read your Caesar!
 */
public static void shred(Base... morituri) {

    for (Base obsoleteObject : morituri) {
        if (obsoleteObject != null) {
            try {
                obsoleteObject.recycle();
            } catch (NotesException e) {
                // We don't care we want go get
                // rid of it anyway
            } finally {
                obsoleteObject = null;
            }
        }
    }

}
于 2013-03-08T06:40:31.963 に答える