优点& cons bean vs SSJS?

时间:2013-03-07 21:35:47

标签: javabeans xpages

我正在尝试构建一个始终检索相同文档(计数器文档)的bean,获取当前值,递增它并使用新值保存文档。最后它应该将值返回给调用方法,这将在我的Xpage中获得一个新的序列号。

由于Domino对象无法序列化或单例化,创建bean的好处是什么,而不是创建SSJS函数做同样的事情?

我的bean必须调用session,database,view和document,然后每次调用它。

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;     
}

谢谢

1 个答案:

答案 0 :(得分:3)

这两段代码都不好(抱歉直言不讳) 如果视图中有一个文档,则不需要在另一个视图上刷新后排队的视图刷新,并且速度非常慢。大概你在谈论一个单一的服务器解决方案(因为复制计数器文件肯定会导致冲突)。

你在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;
            }
        }
    }

}