Jive(J道)升級通知(又一資料庫批次查詢方法應用)

banq發表於2002-09-30
Jive(J道)升級通知(又一資料庫批次查詢方法應用)
今天更新升級了jive(J道)1.1版:

1. 將global.jsp程式碼重構,每個使用者採取session儲存FourmFactory,原來是每次Jsp頁面產生時才即時產生,我認為耗時浪費CPU,增加了com.jdon.web.UserEnvFront類,用來儲存執行期間的一些重要資料。
使用com.jdon.web.DisplayUtil將原來global.jsp中討厭的有關顯示的方法全部包裝進去,我真看不慣Jsp中寫Java方法的,簡直會誤人子弟。

2.增加使用者所有明細貼查詢,只要點按使用者名稱,就可以查詢出他的所有發貼明細,我認為這個功能很重要,可以讓後來者對其他參與者的發言情況有詳細瞭解,並有助於搜尋資訊(只要大概記住是誰發表的就可以)。

由於Jive中的thread頁面顯示是採取filter的decorator模式,總體思路是這樣:

  //準備好結果ResultFilter
  ResultFilter filter = new ResultFilter();
    filter.setStartIndex(start);
    filter.setNumResults(range);

。。。。。。
  //得到某個頁面的所有thread
  ForumThreadIterator threads = forum.threads(filter);
<p class="indent">


在forum.threads(filter)裡的做法是,根據filter動態重組成SQL語句,查詢得到頁面的所有ID集合(不是所有記錄),返回ForumMessageBlockIterator這是類似Pet Store中的Page類(Page by page iterator模式),注意ForumMessageBlockIterator與DatabaseObjectIterator是有區別的:

前者是一個頁面中的iterator,並且加入使用者許可權驗證Proxy,後者是通用的一般Iterator,主要是Jive的使用者管理模組用的比較多。

增加使用者所有明細貼查詢這一功能,看似容易,實際有點小技巧,本來想使用Forum.jsp中顯示thread那樣的頁面排序法,但是由於這種方法是使用filter確定出運算元據庫的SQL語句,根據這個模式走下去,還要構造ForumMessagIteartor這樣新類(可以參考ForumThreadIteartor),當時我覺得沒有必要。

前面討論過,資料庫批次查詢有兩種方法,一種是Jive裡上面的方法,一種是Pet Store中的方法,那麼這裡我就搬遷了Pet Store中的方法,改造後的DbUserManager的userMessages(User user)為下面:

public Iterator userMessages(User user,int start, int count) {
        LongList messages = new LongList();
        Connection con = null;
        PreparedStatement pstmt = null;
        int total =userMessageCount(user) ;
        try {
            con = ConnectionManager.getConnection();
            pstmt = con.prepareStatement(ALL_USER_MESSAGES);
            pstmt.setLong(1, user.getID());
            ResultSet rs = pstmt.executeQuery();
            if (start >= 0 && start < total) {
                  //使用Pet Store的rs定位
                  rs.absolute(start+1);
                  do {
                     messages.add(rs.getLong(1));
                  } while (rs.next() && (--count > 0));
            }
        }
        catch( SQLException sqle ) {
            sqle.printStackTrace();
        }
        finally {
            try {  pstmt.close(); }
            catch (Exception e) { e.printStackTrace(); }
            try {  con.close();   }
            catch (Exception e) { e.printStackTrace(); }
        }
        return new DatabaseObjectIterator(JiveGlobals.MESSAGE, messages.toArray(),
                factory);
    }
<p class="indent">



目前上述更改已經上傳CVS伺服器。

相關文章