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

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

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


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

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

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

DbUserManager.java已经提及了?
我整个update后application和jdon的web目录有更新,DbUserManager好像没变。

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

能不能说说ForumMessageBlockIterator的原理?

用内存来换取速度,这是cache技术的基本之道。

ForumMessageBlockIterator就是一个自己做的iterator,
只不过,在这个iterator初始化时,加入了一些forum的特征,你看一下它的构造函数就知道了。