Jive筆記6 --Database Package下面的暗黑世界 (轉)

amyz發表於2007-08-15
Jive筆記6 --Database Package下面的暗黑世界 (轉)[@more@]

Jive筆記6 --Database Package下面的暗黑世界

Jive筆記6 --Database Package下面的暗黑世界

Written by Shyguy
2002/12/27
Jive再牛B,歸根到底還是要和Database打交道的。還不是要getConnection(),CreateStatement(),ResultSet.next()。
那麼,我的疑問是,Jive是怎樣處理低層操作類(ForumMessage/DBForumThread/DBForum)之間的耦合關係的呢?
由於存在了Cache,所以,DBForumFactory/DBCacheManager/DBForumXXX這些類之間的關係可謂是錯綜複雜。

(1)真正實作中,我們怎樣來完成載入一個ForumMessage? 還有thread的增加刪除Message是怎樣完成的?
開啟DBForumMessage.,發現,除了完成ForumMessage Interface的方法以外,還有幾個Private的方法和Protected的方法。
分別是:
private void loadFromDb();
private void saveToDb();
protected void insertIntoDb();等

上面三個分別用來完成對jiveMessage表的/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 .
我自己在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不給了,而且,JAD還很難反編譯,因為我發現JAD無法反編譯諸如synchronized(Object){}這樣的程式碼。
還好我們有Jive 2.1.1的程式碼。哈哈。看看再說。
先把DBForumFactory的身份給揭穿。其實DbForumFactory是個總管。總管Forum/Thread/Message。
所以,我們在呼叫的時候,都是透過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裡邊,對於整體上的封裝,還是沒有什麼影響的。


呵呵,一家之言,請大家不吝指教
Shyguy

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-958263/,如需轉載,請註明出處,否則將追究法律責任。

相關文章