關於B/S結構的效率, 一些看法.Re: 誰偷走了我的ejb?

jlinux發表於2003-11-24
>>另一公司因為使用jsp+javabeans 兩層結構,使用jdbc直連資料庫(相
>>同水平下,理論上速度應比使用ejb更快),慢的導致使用者不滿,已經
>>被中途踢掉了。

典型的把B/S結構做成了C/S結構, 而且比真真的C/S結構效率低下是肯定的.

B/S結構怎麼能和C/S結構比較呢??? 讓我們來比較這樣作兩者的結構把

這種B/S結構其實就是Browers--->Java(JSP+Java Bean+JDBC)--->DB的結構, 而其中肯定沒有加諸如快取等等增強效能的設計. 在這種情況下其實和C/S結構透過ODBC或者其他直接訪問資料庫是沒有任何區別的.

在用B/S結構做過幾箇中型企業資訊話專案(白天平均線上人數80左右),剛開始我們也是這樣設計的, 效率的確成問題, 還好因為我的設計中使用了DAO和VO模式, 所以在第一個專案的後期在DAO統一加入了快取, 這才提高了大部分的效率, 讓整個專案透過了驗收. 如果這個專案沒有使用DAO/VO模式, 估計肯定死掉.

透過這幾個專案對於B/S結構的效率, 我有一些體會
1.提高效率的基礎 (沒有基礎, 談不上最佳化效率, 只不過是小打小鬧)
首先是技術構架要合理, 如果技術構架不合理, 那麼就很難找到提高效率的地方和方式. 至於上面那種結構,幾乎沒有技術構架可言.如果技術構架不合理, 不管你如何最佳化自己的程式都是不可能的大幅度的提高效率的.
其次是資料庫設計, 這是另外一個重要的方面, 在資料庫設計需要考慮本身的效率和功能實現時的效率, 而且希望能以簡單為主,比如說表之間的關聯關係等等. 大家都應該知道同樣的資料量下, 5個表的關聯查詢比3個表的要慢(只是一個例子). 在我開發的一個專案中, 給遇見過因為資料庫設計不好導致效率低下, 不論我怎麼最佳化程式都無濟於事, 隨後重新設計了資料庫結構, 簡化了設計. 在其中我們還有一個很極端的做法, 一些常用資料時重複的, 比如說一個表關聯了使用者表, 那麼在這張表裡出了有ID欄位, 還有使用者姓名的欄位.
關於B/S結構下的資料庫還有一個問題就是java開發人員不注意SQL語句,而且不管自己的SQL語句效率如何,只要資料正確,這是一個大問題,在我原來(我現在失業了^_^)專案小組中,就有這樣的人, 因為一個SQL語句導致整個系統崩潰也是發生過的. 所以建議所有的java程式設計師補一補資料庫的知識, 特別是資料庫設計和SQL語句.
如果說上面還不能解決問題, 那麼就必須考慮對資料庫進行專門的最佳化或者資料庫叢集.
最後是程式設計師個人的程式設計能力.

2.提高B/S結構效率的總體方向
最主要的方向是平衡 App Server和DB Server的執行壓力.
不知道有多少B/S結構在開始的時候比較過App Server和DB Server佔用的系統資源, 可以試著把兩者分開放到兩個服務其上, 在上面提到的jsp+javabeans 兩層結構中, 你肯定可以發現, App Server其實很輕閒, 而DB Server卻很忙. 當然如果在這種結構下,如果反問次數不多, 卻發現App Server系統資源佔用率很高的話, 哪不用說, 肯定是系統結構不合理或者就是程式效率低下.
我作過這個比較, 在大量人員訪問的情況下, 一般DB Server幾乎滿負荷運轉, 而App Server去沒有使用太多的系統資源.
所以如何平衡兩者之間, 真真的把App Server利用起來是主要方向, 這樣才能體現出App Server的優勢.

在平衡了兩者之間的執行壓力以後, 如果還出現了大的效率問題, 那麼只能使用提高硬體, 使用叢集等等方式來提高效率了.

3.很好利用App Server的幾種方法(以為實踐的java技術有限,所以只能提出這幾種, 希望各位高手能在提供一些)
(Connection pool等等常用的就不提了)
a. 快取, 這是必不可少的, 把一些常用的資料從資料庫中提取出來, 然後放在快取中,這樣可以減少訪問資料庫的次數, 加快讀取速度. 我在具體實踐是使用的是DAO模式和Hibernate, 使用hibernate的快取機制對常用單條記錄進行快取, 使用jcs, 自己寫程式, 對常用的資料列表(比如人員列表)作快取
b. 靜態頁面, 在實際工作中, 有些資料長時間是不會發生改變, 這種情況下我就會考慮把這些資料儲存為靜態頁面.本來是打算儲存為XML檔案的, 但是一直沒有時間作
c. JMS 把一些同步處理改為非同步處理, 加快反應速度, 把一些處理放到App Server空閒時來執行.


關於EJB, 在使用hibernate以後我基本上不再使用EJB, 因為不管是對開發人員的培訓和高效的使用我都沒有把握. 因為我自己對ejb就不是很精通, 至於它好與不好, 我沒有太大的感覺. 也不想去討論.


透過我自己的一些總結,希望大家能就如果增強B/S的效率展開討論.

相關文章