Jive(J道)升级通知(又一数据库批量查询方法应用)

02-09-30 banq

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>

在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>

目前上述更改已经上传CVS服务器。

shyguy
2002-09-30 23:40

我不是很确定,但是jive2.5.x中已经有了这个功能,估计还是filter on user的吧。

banq
2002-10-01 00:07

是recent messages,全部显示需要到lucence里查询。

qdyoung
2002-10-11 13:01

DbUserManager.java已经提及了?

我整个update后application和jdon的web目录有更新,DbUserManager好像没变。

cc
2002-10-11 13:14

“每个用户采取session保存FourmFactory”这样会不会很浪费内存??

能不能说说ForumMessageBlockIterator的原理?

2Go 1 2 下一页