Jive筆記6 --Database Package下面的暗黑世界 (轉)
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Jive筆記7 -- Jive的硬傷 (轉)筆記
- Jive筆記3----Jive2.1.1 License保護原理分析 (轉)筆記
- Jive筆記8--查詢的Bug (轉)筆記
- Jive筆記2----關於Jive2中的中文搜尋 (轉)筆記
- Jive筆記4--結果集分頁處理 (轉)筆記
- Secrets of the Oracle Database筆記OracleDatabase筆記
- Duplicating a Database 筆記Database筆記
- Jive筆記1--關於Jive1中的驗證和相關類的呼叫 (轉)筆記
- rman 建 Standby Database 筆記Database筆記
- 讀“css世界”筆記CSS筆記
- 【JAVA】筆記(6)--- toString方法;equals方法;finalize方法;package與import;內部類;Java筆記PackageImport
- webpack入門筆記——package.json管理Web筆記PackageJSON
- BLOB方面的學習筆記筆記
- 世界五千年 筆記筆記
- GWT筆記(6)筆記
- Package and ClassPath (轉)Package
- Laravel 快速構建後臺 package Voyager 使用筆記LaravelPackage筆記
- rh131筆記---unit2-package management筆記Package
- 《Mastering Delphi 6》學習筆記之十 (轉)AST筆記
- 《Mastering Delphi 6》學習筆記之九 (轉)AST筆記
- 《Mastering Delphi 6》學習筆記之八 (轉)AST筆記
- 《Mastering Delphi 6》學習筆記之五 (轉)AST筆記
- 《Mastering Delphi 6》學習筆記之六 (轉)AST筆記
- 《Mastering Delphi 6》學習筆記之七 (轉)AST筆記
- 《Mastering Delphi 6》學習筆記之四 (轉)AST筆記
- 《Mastering Delphi 6學習筆記》之二 (轉)AST筆記
- Laravel 佇列 --- database 驅動(今天剛學習了佇列,記錄下筆記)Laravel佇列Database筆記
- 2008-6-7 下千shell筆記筆記
- es6筆記筆記
- IPv6筆記筆記
- ECMAScript 6筆記(一)筆記
- #ECMASCRIPT6筆記筆記
- STREAMS筆記(6) rule筆記
- DBMS_FILE_TRANSFER Package in Oracle Database 10gPackageOracleDatabase
- Package Specification 和 Package Body 及 Package有什麼區別? (轉)Package
- 《Mastering Delphi6》學習筆記之三 (轉)AST筆記
- Types of Oracle Database Users : Database Users (6)OracleDatabase
- 最全面的 Spring 學習筆記Spring筆記