jive再牛b,归根到底还是要和database打交道的。
还不一样要调用getconnection(),createstatement(),resultset.next()。
那么,我的疑问是,jive是怎样处理低层操作类(dbforummessage/dbforumthread/dbforum)之间的耦合关系的呢?
由于存在了cache,所以,dbforumfactory/dbcachemanager/dbforumxxx这些类之间的关系可谓是错综复杂。
(1)真正实作中,我们怎样来完成加载一个forummessageobject? 还有thread的增加删除message是怎样完成的?
打开dbforummessage.java,发现,除了完成forummessage interface的方法以外,还有几个private的方法和protected的方法。
分别是:
private void loadfromdb();
private void savetodb();
protected void insertintodb();等
上面三个函数分别用来完成对jivemessage表的select/update/insert操作。
所以初步可以判定,对jivemessage表的操作,基本上封装在了dbforummessage里边了。但不是全部,为什么?慢慢往下看。
a.加载dbforummessage
非常简单,地球人都知道的代码。在一个构造函数中调用loadfromdb(),然后执行select xxx,xxx,..where id=...,如果rs为空则抛出
messagenotfoundexception,否则,一个一个的把字段内容复制给dbforummessage的成员变量。
(顺便这里提一下,这些映射数据库字段的成员变量有些是private的,有些是protected,为什么呢?呵呵。)
对于这样的加载方法,如果没有cache,将会非常慢的。试想,每次显示一个message都要一次select,我浏览thread页面的时候,一次显示n个thread/message,....
还不要数据库的小命啊。
在我克隆jive的过程中,由于cache机制将在以后实现,所以采取了一个折衷的办法。改写了dbmessageiterator()类,改原来的只取id
为 取回除了body以外的所有的内容,并且 直接就地new dbforummessage,然后复制到arraylist。
至于body,则采用lazyload的方法,等用到了才去select body from ...
这样处理,由于有resultfilter的限制,最多复制几十个没有body的dbforummessag 对象,这对于appserver来说,我想影响不大吧?
b.增加dbforummessage
也就是调用insert into jivemessage啦。不过,注意到,在插入新的forummessage纪录的时候,threadid是必须的,
所以看起来只能让dbforumthread来调用这个方法了。难怪!!用了protected insertintodb(dbforumthread)!! 原来,同在一个包下的class是
可以互相访问protected的方法的。偶java基本功不行,呵呵,到了今天才发现的这种现象。
c.删除dbforummessage
这个比较有趣,dbforummessage没有任何执行delete from jivemessage的代码,看起来一定是在外边dbthread实现了。
毕竟,这个是thread的事情嘛。果不出所料,dbforumthread::deletemessage()里边直接执行了delete sql.
我自己在clone jive的时候,还是作了小改动,给dbforummessage添加了protected deletefromdb()方法,把执行sql的操作放给message完成了。
在对message进行add/delete操作过程中,可不能忘记了cache list的更新,所以必须记得在dbforummessage中调用cachemanager的一些方法
来更新cache,虽然目前在我的系统中,这些函数是空的 :)。
明白了thread/message之间的"父子关系",forum/thread category/forum之间的关系也就差不多啦。哦,jive中的category好像有点特别,
等偶下次看了代码再另外详细汇报。
(2)dbforumfactory是个什么东西?
jive2.1.1以后,dbforumfactory不给source了,而且,jad还很难反编译,因为我发现jad无法反编译诸如synchronized(object){}这样的代码。
还好我们有jive 2.1.1的代码。哈哈。看看再说。
先把dbforumfactory的身份给揭穿。其实dbforumfactory是个总管。总管forum/thread/message。
所以,我们在调用api的时候,都是通过factory.getforum()/getthread()/getmessage()来获得那些对象。
jive用了singleton保证dbforumfactory()唯一,即静态方法dbforumfactory.getinstance()。
同时,dbforumfactory在构造函数中new了一个databasecachemanager。因此factory和cachemanager就这样勾结起来了。
所有调用getforum(),getthread(),getmessage(),都是调用databasecachemanager的相关方法来实现的。
例:
dbforumfactory::getthread() ==> databasecachemanager.getthread() ==> search cache or new dbthread object
结论,dbforumfactory不是东西。除了检测licese是否合法,其它基本上就是一个二道贩子。
(3)其实还有那些thread/message的dbiterator,在jive笔记4中已经提到了。不必再罗嗦一遍。
写了这么多,感觉还有好多东西没有讲。我希望大家能够仔细体味里边的protected 属性/方法,我认为,这些东西其实和友元差不多,
它们部分的打破了封装,但是获得了很大的灵活性。
退后一步想想,我们只要把那些东西一股脑儿的限制在database package里边,对于整体上的封装,还是没有什么影响的。
呵呵,一家之言,请大家不吝指教
闽公网安备 35060202000074号