1. 程式人生 > >走自己的java路 與別人拉開差距

走自己的java路 與別人拉開差距

java 分布式

1:什麽是高並發?
什麽是高並發,比如從網上下載一個電影,全國有很多人同時在下載這個電影。
比如某個淘寶店鋪,有很多店員,某個用戶買了這個店鋪的商品,多個店員同時去處理這個訂單。
從程序的角度來講,高並發,就是很多人同時訪問同一段程序代碼,同一個網頁,同一個web服務器,同一個數據庫,數據表。
2:高並發會引起那些問題?
還是上面的例子,多個人同時去下載一個服務器上的電影,如果服務器不夠好,是不是容易掛掉?如果服務器允許的最大連接數不夠大,那麽是不是有很多用戶需要等待,給用戶帶來的體驗效果就會很差。從這個角度來講,並發會引起反應慢,效率低,用戶體驗差的問題。
我們的第二個例子,多個店員同時處理一個訂單,如果多個店員都成功處理這個訂單,那麽是不是用戶花一份的前,買到了多份的東西,這個例子最經典的銀行卡取錢的,兩張一樣的銀行卡,同時去自動取款機取錢,本來銀行卡中只有1000元,但是如果並發了,兩張卡取錢的時候卡內都有余額1000,那麽就可以取出2000元錢。(這裏不僅涉及到事務的問題,還涉及到並發的問題)

3:高並發系統的設計需要註意一下幾點:
盡量使用緩存,包括用戶緩存,信息緩存等,多花點內存來做緩存,可以大量減少與數據庫的交互,提高性能。
用jprofiler等工具找出性能瓶頸,減少額外的開銷。
優化數據庫查詢語句,減少直接使用hibernate等工具的直接生成語句(僅耗時較長的查詢做優化)。
優化數據庫結構,多做索引,提高查詢效率。
統計的功能盡量做緩存,或按每天一統計或定時統計相關報表,避免需要時進行統計的功能。

能使用靜態頁面的地方盡量使用,減少容器的解析(盡量將動態內容生成靜態html來顯示)。
解決以上問題後,使用服務器集群來解決單臺的瓶頸問題。
基本上以上述問題解決後,達到系統最優。
4:經過查資料,方案如下所示。

1 從最基礎的地方做起,優化我們寫的代碼,減少必要的資源浪費。
a、避免頻繁的使用new對象,對於整個應用只需要存在一個實例的類,我們可以使用單例模式。對於String連接操作,使用 StringBuffer或StringBuilder,對於工具類可以通過靜態方法來訪問。
b、避免使用錯誤的方式,盡量不用instanceof做條件判斷。使用java中效率高的類,比如ArrayList比Vector性能好。
給大家推薦一個java內部學習群:725633148,進群找管理免費領取學習資料和視頻。沒有錯就是免費領取!大佬小白都歡迎,大家一起學習共同進步!

2 html靜態化
我們通過一個鏈接地址訪問,通過這個鏈接地址,服務器對應的模塊處理這個請求,轉到對應的jsp頁面,最後生成我們要的數據。但是,如果上千萬個請求的話,有太多的高並發請求,那麽就會加重服務器的壓力,最壞的情況是把服務器down掉。那麽如何避免這種情況的出現呢?如果我們把最初對test.do的請求結果保存成一個html文件,然後每次用戶都去訪問這個html文件,這樣就不用再去訪問服務器了,服務器的壓力不就減少了?

那如何自動的生成靜態頁面,當用戶去訪問,會自動的生成test.html ,然後再顯示給用戶。
3 圖片服務器分離
對於web服務器來說,圖片是最消耗資源的,於是我們有必要把圖片與頁面進行分離,我們把圖片放到獨立的圖片服務器。這樣的架構可以降低提供頁面訪問請求的服務器系統壓力,並且可以保證系統不會因為圖片的問題而崩潰。在圖片服務器上,我們可以對不同的配置進行優化。
4 緩存
具體接觸過的緩存機制是hibernate的緩存機制。為了避免每次都向數據庫中取得數據,我們把用戶常常訪問到的數據放到內存中,甚至緩存十分大的時候我們可以把內存中的緩存放到硬盤中。還有高級的分布式緩存數據庫使用,都可以增加系統的抗壓力。

5 分批傳送
在做某項目的時候,一次傳遞的參數太多,而且數據庫規定一次最多傳遞的參數最多是三萬條,當時有五萬條記錄,那怎麽傳送呢?最終是分批傳送,電梯裏一次乘不下那麽多的人,會報超重的bug,那就分批把人送上去。
還有一次在考試系統中,如果那麽多的考試人員同時提交到數據庫中,數據庫的壓力增大,有時會被down掉,當時采用的方法是使用ajax異步傳輸,沒有等待考生點擊提交按鈕的時候,就把考生的答案自動提交,這樣也避免了突然斷電考生前面做過的題出現丟失的現象。
6 數據庫集群
當面對復雜的應用,用戶大量訪問的時候,一臺數據很快無法滿足需求,於是我們需要使用數據庫集群或者庫表散列。
我們在應用程序中安裝業務和應用或者功能模塊將數據進行分離,不同的模塊對應不同的數據庫或表,再按照一定的策略對某個頁面或者功能進行更小的數據庫散列。
7 DB優化
a、在數據庫設計的時候就要考慮到後期的維護,數據庫三範式是我們設計數據庫索要遵循的原則。
b、索引的建立:建立索引要適當,如果一個表經常用來被查詢,對於增加和修改很少被用到,我們就可以為這個表建立索引,因為對於增加和修改和刪除操作時,我們對索引的維護要大大超過索引給我們帶來的效率。
c、表字段的類型選擇要恰當
包括字段的長度、類型等,要根據實際存儲的數據進行選擇,長度不要過長,否則會影響效率。
d、外鍵要慎用,因為主鍵代表這一張表,而外鍵代表一群表,對表之間進行了關聯,在刪除修改等需要我們關聯。
e、在數據庫操作上盡量使用prepareStatement,少用Statement,因為PrepareStatement是進行預編譯的。connection設置為readOnly,Connection是對書庫連接,屬於重量級,我們使用即可。連接池的使用,我們可以修改數據庫默認的連接數。

走自己的java路 與別人拉開差距