A. java程序員面試時被問到:如何在j2ee項目中處理高並發量訪問 該怎麼回答 請仔細看題干再回答
你好,高並發系抄統的設計需要注意襲一下幾點:
盡量使用緩存,包括用戶緩存,信息緩存等,多花點內存來做緩存,可以大量減少與資料庫的交互,提高性能。
用jprofiler等工具找出性能瓶頸,減少額外的開銷。
優化資料庫查詢語句,減少直接使用hibernate等工具的直接生成語句(僅耗時較長的查詢做優化)。
優化資料庫結構,多做索引,提高查詢效率。
統計的功能盡量做緩存,或按每天一統計或定時統計相關報表,避免需要時進行統計的功能。
能使用靜態頁面的地方盡量使用,減少容器的解析(盡量將動態內容生成靜態html來顯示)。
解決以上問題後,使用伺服器集群來解決單台的瓶頸問題。
基本上以上述問題解決後,達到系統最優。
至於樓上有人提到別用JAVA來做,除非是低層的連接數過大(如大量的埠佔用需求),這種情況下考慮直接C來寫,其他的可以用JAVA來做。
B. Java高並發,如何解決,什麼方式解決
兩個方向。
代碼方向:1優化代碼,提高處理速度,2網路使用nio模式。3 使用非同步模式。4 使用memcache等內存緩存
硬體方向:1 伺服器升級 2 資料庫升級 3 縱向或橫向增加伺服器。
C. java程序員面試時如何回答「如何在j2ee項目中處理高並發量訪問」
盡量使用緩存,包括用戶緩存,信息緩存等,多花點內存來做緩存,可以大量減少回與資料庫的交互,提高性答能。
D. java中怎麼解決高並發的問題
幾點需要注意:
1盡量使用緩存,包括用戶緩存,信息緩存等,多花點內存來做版緩存,權可以大量減少與資料庫的交互,提高性能。
2用jprofiler等工具找出性能瓶頸,減少額外的開銷。
3優化資料庫查詢語句,減少直接使用hibernate等工具的直接生成語句(僅耗時較長的查詢做優化)。
4優化資料庫結構,多做索引,提高查詢效率。
5統計的功能盡量做緩存,或按每天一統計或定時統計相關報表,避免需要時進行統計的功能。
6能使用靜態頁面的地方盡量使用,減少容器的解析(盡量將動態內容生成靜態html來顯示)。
7解決以上問題後,使用伺服器集群來解決單台的瓶頸問題。
E. java如何處理高並發
你指的高並發量大概有多少?
幾點需要注意:
盡量使用緩存,包括用戶緩存,信息緩存等,內多花點容內存來做緩存,可以大量減少與資料庫的交互,提高性能。
用jprofiler等工具找出性能瓶頸,減少額外的開銷。
優化資料庫查詢語句,減少直接使用hibernate等工具的直接生成語句(僅耗時較長的查詢做優化)。
優化資料庫結構,多做索引,提高查詢效率。
統計的功能盡量做緩存,或按每天一統計或定時統計相關報表,避免需要時進行統計的功能。
能使用靜態頁面的地方盡量使用,減少容器的解析(盡量將動態內容生成靜態html來顯示)。
解決以上問題後,使用伺服器集群來解決單台的瓶頸問題。
基本上以上述問題解決後,達到系統最優。
至於樓上有人提到別用JAVA來做,除非是低層的連接數過大(如大量的埠佔用需求),這種情況下考慮直接C來寫,其他的可以用JAVA來做。
可以網上購買視頻做教育學習。
F. java解決高並發的幾種方法
高並復發系統的設計需要注制意一下幾點:
用jprofiler等工具找出性能瓶頸,減少額外的開銷。
盡量使用緩存,包括用戶緩存,信息緩存等,多花點內存來做緩存,可以大量減少與資料庫的交互,提高性能。
優化資料庫查詢語句,減少直接使用hibernate等工具的直接生成語句(僅耗時較長的查詢做優化)。
優化資料庫結構,多做索引,提高查詢效率。
統計的功能盡量做緩存,或按每天一統計或定時統計相關報表,避免需要時進行統計的功能。
能使用靜態頁面的地方盡量使用,減少容器的解析(盡量將動態內容生成靜態html來顯示)。
硬體上就是提高伺服器性能,提升允許最大訪問量,代碼上面可以使用連接池的方式,更合理的規劃連接,提高連接的有效利用率
負載均衡(軟體負載均衡、硬體負載均衡)
分布式資料庫(資料庫主從分布、資料庫分割、資料庫緩存)
可以採用nginx或者lvs軟體工具,他好像最高支持65535的並發訪問。
實實在在太大的話,終極解決方式隊列方式,通過mq一個一個排隊方式,跟12306一樣。
G. 用Java做一個大流量,高並發的網站應該怎麼樣進行底層構架
JVM
JEE容器中運行的JVM參數配置參數的正確使用直接關繫到整個系統的性能和處理能力,JVM的調優主要是對內存管理方面的調優,優化的方向分為以下4點:
1.HeapSize 堆的大小,也可以說Java虛擬機使用內存的策略,這點是非常關鍵的。
2.GarbageCollector 通過配置相關的參數進行Java中的垃圾收集器的4個演算法(策略)進行使用。
3.StackSize 棧是JVM的內存指令區,每個線程都有他自己的Stack,Stack的大小限制著線程的數量。
4.DeBug/Log 在JVM中還可以設置對JVM運行時的日誌和JVM掛掉後的日誌輸出,這點非常的關鍵,根據各類JVM的日誌輸出才能配置合適的參數。
網上隨處可見JVM的配置技巧,但是我還是推薦閱讀Sun官方的2篇文章,可以對配置參數的其所依然有一個了解
1.Java HotSpot VM Options
Java HotSpot VM Options
2.Troubleshooting Guide for Java SE 6 with HotSpot VMTroubleshooting Guide for Java SE 6 with HotSpot VM
另外,我相信不是每個人攻城師都是天天對著這些JVM參數的,如果你忘記了那些關鍵的參數你可以輸入Java -X(大寫X)進行提示。
JDBC
針對MySQL的JDBC的參數在之前的文章中也有介紹過,在單台機器或者集群的環境下合理的使用JDBC中的配置參數對操作資料庫也有很大的影響。
一些所謂高性能的 Java ORM開源框架也就是打開了很多JDBC中的默認參數:
1.例如:autoReconnect、prepStmtCacheSize、cachePrepStmts、useNewIO、blobSendChunkSize 等,
2.例如集群環境下:roundRobinLoadBalance、failOverReadOnly、autoReconnectForPools、secondsBeforeRetryMaster。
具體內容可以參閱MySQL的JDBC官方使用手冊:
http://dev.mysql.com/doc/refman/5.1/zh/connectors.html#cj-jdbc-reference
資料庫連接池(DataSource)
應用程序與資料庫連接頻繁的交互會給系統帶來瓶頸和大量的開銷會影響到系統的性能,JDBC連接池負責分配、管理和釋放資料庫連接,它允許應用程序重復使用一個現有的資料庫連接,而再不是重新建立一個連接,因此應用程序不需要頻繁的與資料庫開關連接,並且可以釋放空閑時間超過最大空閑時間的資料庫連接來避免因為沒有釋放資料庫連接而引起的資料庫連接遺漏。這項技術能明顯提高對資料庫操作的性能。
在此我認為有一點需要說明:
連接池的使用也是需要關閉,因為在資料庫連接池啟動的時候就預先和資料庫獲得了相應的連接,之後不再需要應用程序直接的和資料庫打交道,因為應用程序使用資料庫連接池是一個「借」的概念,應用程序從資料庫連接池中獲得資源是「借出」,還需要還回去,就好比有20個水桶放在這里,需要拿水的人都可以使用這些木桶從水池裡面拿水,如果20個人都拿完水,不將水桶還回原地,那麼後面來的人再需要拿水,只能在旁邊等待有人將木桶還回去,之前的人用完後需要放回去,不然後面的人就會一直等待,造成資源堵塞,同理,應用程序獲取資料庫連接的時候Connection連接對象的時候是從「池」中分配一個資料庫連接出去,在使用完畢後,歸還這個資料庫連接,這樣才能保持資料庫的連接「有借有還」准則。
參考資料:
http://dev.mysql.com/doc/refman/5.1/zh/connectors.html#cj-connection-pooling
數據存取
資料庫伺服器的優化和數據的存取,什麼類型的數據放在什麼地方更好是值得去思考的問題,將來的存儲很可能是混用的,Cache,NOSQL,DFS,DataBase 在一個系統中都會有,生活的餐具和平日里穿衣服需要擺放在家裡,但是不會用同一種類型的傢具存放,貌似沒有那個人家把餐具和衣服放在同一個櫃子裡面的。這就像是系統中不同類型的數據一樣,對不同類型的數據需要使用合適的存儲環境。文件和圖片的存儲,首先按照訪問的熱度分類,或者按照文件的大小。強關系類型並且需要事務支持的採用傳統的資料庫,弱關系型不需要事務支持的可以考慮NOSQL,海量文件存儲可以考慮一下支持網路存儲的DFS,至於緩存要看你單個數據存儲的大小和讀寫的比例。
還有一點值得注意就是數據讀寫分離,無論在DataBase還是NOSQL的環境中大部分都是讀大於寫,因此在設計時還需考慮 不僅僅需要讓數據的讀分散在多台機器上,還需要考慮多台機器之間的數據一致性,MySQL的一主多從,在加上MySQL-Proxy或者借用JDBC中的一些參數(roundRobinLoadBalance、failOverReadOnly、autoReconnectForPools、secondsBeforeRetryMaster)對後續應用程序開發,可以將讀和寫分離,將大量讀的壓力分散在多台機器上,並且還保證了數據的一致性。
緩存
在宏觀上看緩存一般分為2種:本地緩存和分布式緩存
1.本地緩存,對於Java的本地緩存而言就是講數據放入靜態(static)的數據結合中,然後需要用的時候就從靜態數據結合中拿出來,對於高並發的環境建議使用 ConcurrentHashMap或者CopyOnWriteArrayList作為本地緩存。緩存的使用更具體點說就是對系統內存的使用,使用多少內存的資源需要有一個適當比例,如果超過適當的使用存儲訪問,將會適得其反,導致整個系統的運行效率低下。
2. 分布式緩存,一般用於分布式的環境,將每台機器上的緩存進行集中化的存儲,並且不僅僅用於緩存的使用范疇,還可以作為分布式系統數據同步/傳輸的一種手段,一般被使用最多的就是Memcached和Redis。
數據存儲在不同的介質上讀/寫得到的效率是不同的,在系統中如何善用緩存,讓你的數據更靠近cpu,下面有一張圖你需要永遠牢記在心裡,來自Google的技術大牛Jeff Dean(Ref)的傑作,如圖所示:
並發/多線程
在高並發環境下建議開發者使用JDK中自帶的並發包(java.util.concurrent),在JDK1.5以後使用java.util.concurrent下的工具類可以簡化多線程開發,在java.util.concurrent的工具中主要分為以下幾個主要部分:
1.線程池,線程池的介面(Executor、ExecutorService)與實現類(ThreadPoolExecutor、 ScheledThreadPoolExecutor),利用jdk自帶的線程池框架可以管理任務的排隊和安排,並允許受控制的關閉。因為運行一個線程需要消耗系統CPU資源,而創建、結束一個線程也對系統CPU資源有開銷,使用線程池不僅僅可以有效的管理多線程的使用,還是可以提高線程的運行效率。
2.本地隊列,提供了高效的、可伸縮的、線程安全的非阻塞 FIFO 隊列。java.util.concurrent 中的五個實現都支持擴展的 BlockingQueue 介面,該介面定義了 put 和 take 的阻塞版本:LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue 和 DelayQueue。這些不同的類覆蓋了生產者-使用者、消息傳遞、並行任務執行和相關並發設計的大多數常見使用的上下文。
H. 用Java做一個大流量,高並發的網站應該怎麼樣進行底層構架
別把高並發想復雜了,只要你能做到單個應用有並發,就算並發量只有2(這里有些誇張專了),也屬可以通過集群來建立高並發。並發靠的是負載均衡,把大並發量平均轉移到各個系統節點上而已,你只要保證單應用的並發可靠性就好了。當然也有部分是要考慮,多機執行沖突和session共享,各類鎖的解決方案,具體看個人需求。
I. 用Java做一個大流量,高並發的網站應該怎麼樣進行底層構架
架構是為了解決糸統中具有共性的問題而進行定義了減少重復工作量,且易於維護和擴展的技術准則和規范,它產出物和體現為文檔和基礎代碼框架等。
因此選擇那些框架只是架構的一部分,通常是選擇自己善長的,以及對新技術的更新比較及時的;所以現在的Java框架最多為SpringMVC。
所以你提出的大並發是一個問題,但先確定它是不是所有模塊都需要解決這個問題。
而大數據又是另一個問題,同樣每個模塊查詢或者計算都是大數據嗎。
綜上所述將問題定位並分解,並發問題,要考慮帶寬還是區域網,一個應用伺服器最大能支持多少請求連接,你需要多少個,每個應用伺服器是獨立的模塊呢還是齊群。齊群還要注意的登錄一次還是多次,也就是SSO了,是否注意內存共享,如sessionId,是否考慮內存相互同步還是通過分布式的解決等糸列問題。還有一個資料庫有多少連接可以用等跟應用伺服器同理。
那麼大數據呢,要考慮的關鍵為兩個,是計算還是查詢,是實時的業務要求還是可以延時的,查詢可以是緩存,分表分庫,分區,索引等方式。緩存的時候要注意你考慮的帶寬是一個lDC還是多個IDC,數據間怎麼同歩是個分布式問題,如果大數據計算問題是否考慮一下雲計算解決方案等
因此你所說的怎麼架構,如何選框架,這是兩個問題,不是解決你問的大數據大並發,反而是架構工作中的一個塵灰而已。你也知道架構最大的是那裡了吧一一分析到分割。
架構是很難的工作,作不好,別相信用硬體能解決問題。就像使用微軟的 盜版一樣,出了問題可能是用N的成本來解決,N可能是幾萬,也可能是幾萬的N次方。
J. 面試Java開發時問到高並發怎麼處理的,還有sql優化有哪些辦法,有哪位大神知道啊,新手!!
Java開發高並發的處理方法:
最基礎的地方做起,優化我們寫的代碼,減少必要的資源浪費
避免頻繁的使用對象,對於整個應用只需要存在一個實例的類,我們可以使用單例模式。對於String連接操作,使用StringBuffer或StringBuilder,對於工具類可以通過靜態方法來訪問。
避免使用錯誤的方式,盡量不用instanceof做條件判斷。使用java中效率高的類,比如ArrayList比Vector性能好。
圖片伺服器分離
對於web伺服器來說,圖片是最消耗資源的,於是我們有必要把圖片與頁面進行分離,我們把圖片放到獨立的圖片伺服器。這樣的架構可以降低提供頁面訪問請求的伺服器系統壓力,並且可以保證系統不會因為圖片的問題而崩潰。在圖片伺服器上,我們可以對不同的配置進行優化。
緩存
具體接觸過的緩存機制是hibernate的緩存機制。為了避免每次都向資料庫中取得數據,我們把用戶常常訪問到的數據放到內存中,甚至緩存十分大的時候我們可以把內存中的緩存放到硬碟中。還有高級的分布式緩存資料庫使用,都可以增加系統的抗壓力。
分批傳送
在做某項目的時候,一次傳遞的參數太多,而且資料庫規定一次最多傳遞的參數最多是三萬條,當時有五萬條記錄,那怎麼傳送呢?最終是分批傳送,電梯里一次乘不下那麼多的人,會報超重的bug,那就分批把人送上去。
還有一次在考試系統中,如果那麼多的考試人員同時提交到資料庫中,資料庫的壓力增大,有時會被down掉,當時採用的方法是使用ajax非同步傳輸,沒有等待考生點擊提交按鈕的時候,就把考生的答案自動提交,這樣也避免了突然斷電考生前面做過的題出現丟失的現象。
DB優化
在資料庫設計的時候就要考慮到後期的維護,資料庫三範式是我們設計資料庫索要遵循的原則。
索引的建立:建立索引要適當,如果一個表經常用來被查詢,對於增加和修改很少被用到,我們就可以為這個表建立索引,因為對於增加和修改和刪除操作時,我們對索引的維護要大大超過索引給我們帶來的效率。
表欄位的類型選擇要恰當。包括欄位的長度、類型等,要根據實際存儲的數據進行選擇,長度不要過長,否則會影響效率。
外鍵要慎用,因為主鍵代表這一張表,而外鍵代表一群表,對表之間進行了關聯,在刪除修改等需要我們關聯。
在資料庫操作上。 盡量使用prepareStatement,少用Statement,因為PrepareStatement是進行預編譯的。
connection設置為readOnly,Connection是對書庫連接,屬於重量級,我們使用即可。
連接池的使用,我們可以修改資料庫默認的連接數。