多個線程在訪問同一個資料庫中的記錄的時候,在大並發的情況下,一定要做好事務機制。要不然後果還是很扎心的。可能遇到這樣的問題的時候首先想到的就是同步鎖機制了。
並發產生的情況
其實在實際項目開發匯總,首先要做的就是避免多個線程共用一個資料庫連接,這樣會很容易出問題,最好是一個線程一個連接。在必要的時候需要線程同步或存儲過程加鎖。如果有比較復雜的事務操作的話就需要加鎖了,如果不加的話就會出現你說的臟讀、死鎖等問題。
『貳』 JAVA中高訪問量高並發的問題怎麼解決
你指的高並發量大概有多少?
幾點需要注意:
盡量使用緩存,包括用戶緩存,信息緩存等,多花點內存來做緩存,可以大量減少與資料庫的交互,提高性能。
用jprofiler等工具找出性能瓶頸,減少額外的開銷。
優化資料庫查詢語句,減少直接使用hibernate等工具的直接生成語句(僅耗時較長的查詢做優化)。
優化資料庫結構,多做索引,提高查詢效率。
統計的功能盡量做緩存,或按每天一統計或定時統計相關報表,避免需要時進行統計的功能。
能使用靜態頁面的地方盡量使用,減少容器的解析(盡量將動態內容生成靜態html來顯示)。
解決以上問題後,使用伺服器集群來解決單台的瓶頸問題。
基本上以上述問題解決後,達到系統最優。
至於樓上有人提到別用JAVA來做,除非是低層的連接數過大(如大量的埠佔用需求),這種情況下考慮直接C來寫,其他的可以用JAVA來做。
『叄』 java高並發,如何解決,什麼方式解決,高並發
首先,為防止高並發帶來的系統壓力,或者高並發帶來的系統處理異常,數據紊亂,可以以下幾方面考慮:1、加鎖,這里的加鎖不是指加java的多線程的鎖,是指加應用所和資料庫鎖,應用鎖這邊通常是使用redis的setnx來做,其次加資料庫鎖,因為代碼中加了應用所,所以資料庫不建議加悲觀鎖(排他鎖),一般加樂觀鎖(通過設置一個seq_no來解決),這兩個鎖一般能解決了,最後做合理的流控,丟棄一部分請求也是必不可少的
『肆』 JAVA解決資料庫並發問題
幾百人報名就叫並發嗎?
概念錯了!
幾百人操作幾百條互不相關的數據那個不叫並發,只有同時操作同一條數據的情況才叫並發。
如果兩人同時修改同一條數據的話,那個要不就使用行鎖(悲觀鎖),要不就用version(樂觀鎖)控制。
其它情況無需考慮的。
『伍』 java多線程訪問資料庫怎麼優化啊,並發很大
個人覺得高寫入並發的話先用緩存緩沖一下,可以合並的寫入合並成批量寫入可以管一些用但終歸寫入量很大的話還是要在資料庫端優化了,把並發寫均衡到多台伺服器上,應該沒有別的辦法了。如果瓶頸不再資料庫那就是應用伺服器處理能力不足,升級應用伺服器。
『陸』 java多用戶同時訪問和資料庫進行交互,如何能夠高並發
我覺得1萬的數據並發量並不大,想oracle資料庫,mysql承載這些並發是沒有問題的
我覺得,主要的問題在於你GPS是一直在修改的,因為車輛在不斷的行駛,這樣的話,可能會影響資料庫的性能
我覺得,你可以用一個內存行的資料庫,比如,redis,用這個來存放GPS信息,redis是基於內存的,讀寫要比關系資料庫速度快(忽略網路因素),你可能要問GPS入庫怎麼弄,可以做一個定時任務,每隔多少時間來將redis的數據寫入到資料庫中,當然,redis也支持一些演算法,比如LRU,來設置何時將數據同步到資料庫
『柒』 java程序員面試時被問到:如何在j2ee項目中處理高並發量訪問 該怎麼回答 請仔細看題干再回答
一般需從三點入手。
一、程序本身支持高並發。
簡單來說就是要優化我們的代碼。
1、避免使用錯誤的方式,盡量不用instanceof做條件判斷,不要將數組聲明為:public static final 。
2、使用java中效率高的類,比如盡量使用HashMap 和ArrayList ,除非必要,否則不推薦使用HashTable和Vector ,後者由於使用同步機制,而導致了性能的開銷。
3、盡量指定類的final修飾符 帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String。為String類指定final防止了人們覆蓋length()方法。另外,如果指定一個類為final,則該類所有的方法都是final。Java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使性能平均提高50% 。
4、盡量重用對象,避免頻繁的使用new對象。對於整個應用只需要存在一個實例的類,我們可以使用單例模式。對於工具類可以使用靜態方法的方式訪問。
用new關鍵詞創建類的實例時,構造函數鏈中的所有構造函數都會被自動調用。但如果一個對象實現了Cloneable介面,我們可以調用它的clone()方法。clone()方法不會調用任何類構造函數。
在使用設計模式(Design Pattern)的場合,如果用Factory模式創建對象,則改用clone()方法創建新的對象實
例非常簡單。例如,
Java代碼收藏代碼
下面是Factory模式的一個典型實現:
(){
returnnewCredit();
}
改進後的代碼使用clone()方法,如下所示:
privatestaticCreditBaseCredit=newCredit();
(){
return(Credit)BaseCredit.clone();
}
上面的思路對於數組處理同樣很有用。
5、特別是String 對象的使用中,出現字元串連接情況時應用StringBuffer 代替。由於系統不僅要花時間生成對象,以後可能還需花時間對這些對象進行垃圾回收和處理。因此,生成過多的對象將會給程序的性能帶來很大的影響。
6、StringBuffer 的使用:StringBuffer表示了可變的、可寫的字元串。
它有三個構造方法 :
StringBuffer();//默認分配16個字元的空間
StringBuffer(intsize);//分配size個字元的空間
StringBuffer(Stringstr);//分配16個字元+str.length()個字元空間
你可以通過StringBuffer的構造函數來設定它的初始化容量,這樣可以明顯地提升性能。這里提到的構造函數是StringBuffer(int length),length參數表示當前的StringBuffer能保持的字元數量。你也可以使用ensureCapacity(int minimumcapacity)方法在StringBuffer對象創建之後設置它的容量。首先我們看看StringBuffer的預設行為,然 後再找出一條更好的提升性能的途徑。
StringBuffer在內部維護一個字元數組,當你使用預設的構造函數來創建StringBuffer對象的時候,因為沒有設置初始化字元長度,StringBuffer的容量被初始化為16個字元,也就是說預設容量就是16個字元。當StringBuffer達到最大容量 的時候,它會將自身容量增加到當前的2倍再加2,也就是(2*舊值+2)。如果你使用預設值,初始化之後接著往裡面追 加字元,在你追加到第16個字元的時候它會將容量增加到34(2*16+2),當追加到34個字元的時候就會將容量增加到 70(2*34+2)。無論何事只要StringBuffer到達它的最大容量它就不得不創建一個新的字元數組然後重新將舊字元和 新字元都拷貝一遍――這也太昂貴了點。所以總是給StringBuffer設置一個合理的初始化容量值是錯不了的,這樣會帶來 立竿見影的性能增益。
StringBuffer初始化過程的調整的作用由此可見一斑。所以,使用一個合適的容量值來初始化StringBuffer永遠都是一個最佳的建議。
7、盡量使用局部變數,調用方法時傳遞的參數以及在調用中創建的臨時變數都保存在棧(Stack)中,速度較快。其他變數,如靜態變數、實例變數等,都在堆(Heap)中創建,速度較慢。另外,依賴於具體的編譯器/JVM,局部變數還可能得到進一步優化。請參見《盡可能使用堆棧變數》。
8、不要重復初始化變數 默認情況下,調用類的構造函數時, Java會把變數初始化成確定的值:所有的對象被設置成null,整數變數(byte、short、int、long)設置成0,float和double變數設置成0.0,邏輯值設置成false。當一個類從另一個類派生時,這一點尤其應該注意,因為用new關鍵詞創建一個對象時,構造函數鏈中的所有構造函數都會被自動調用。
9、在JAVA + ORACLE 的應用系統開發中,java中內嵌的SQL語句盡量使用大寫的形式,以減輕ORACLE解析器的解析負擔。
10、Java 編程過程中,進行資料庫連接、I/O流操作時務必小心,在使用完畢後,即使關閉以釋放資源。因為對這些大對象的操作會造成系統大的開銷,稍有不慎,會導致嚴重的後果。
11、由於JVM的有其自身的GC機制,不需要程序開發者的過多考慮,從一定程度上減輕了開發者負擔,但同時也遺漏了隱患,過分的創建對象會消耗系統的大量內存,嚴重時會導致內存泄露,因此,保證過期對象的及時回收具有重要意義。JVM回收垃圾的條件是:對象不在被引用;然而,JVM的GC並非十分的機智,即使對象滿足了垃圾回收的條件也不一定會被立即回收。所以,建議我們在對象使用完畢,應手動置成null。
12、在使用同步機制時,應盡量使用方法同步代替代碼塊同步。
13、盡量減少對變數的重復計算
例如:
for(inti=0;i<list.size;i++){
…
}
應替換為:
for(inti=0,intlen=list.size();i<len;i++){
…
}
14、盡量採用lazy loading 的策略,即在需要的時候才開始創建。
例如:
Stringstr=「aaa」;
if(i==1){
list.add(str);
}
應替換為:
if(i==1){
Stringstr=「aaa」;
list.add(str);
}
15、慎用異常
異常對性能不利。拋出異常首先要創建一個新的對象。Throwable介面的構造函數調用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調用跟蹤信息。只要有異常被拋出,VM就必須調整調用堆棧,因為在處理過程中創建了一個新的對象。 異常只能用於錯誤處理,不應該用來控製程序流程。
16、不要在循環中使用try...catch,應把其放置在最外層。
17、合理的使用Java類 java.util.Vector。
簡單地說,一個Vector就是一個java.lang.Object實例的數組。Vector與數組相似,它的元素可以通過整數形式的索引訪問。但是,Vector類型的對象在創建之後,對象的大小能夠根據元素的增加或者刪除而擴展、縮小。請考慮下面這個向Vector加入元素的例子:
Java代碼收藏代碼
Objectobj=newObject();
Vectorv=newVector(100000);
for(intI=0;
I<100000;I++){v.add(0,obj);}
『捌』 java多用戶同時訪問和資料庫進行交互,如何能夠高並發
我覺得1萬的數據並發量並不大,想oracle資料庫,mysql承載這些並發是沒有問題的
我覺得,主要的問題在於你GPS是一直在修改的,因為車輛在不斷的行駛,這樣的話,可能會影響資料庫的性能
我覺得,你可以用一個內存行的資料庫,比如,redis,用這個來存放GPS信息,redis是基於內存的,讀寫要比關系資料庫速度快(忽略網路因素),你可能要問GPS入庫怎麼弄,可以做一個定時任務,每隔多少時間來將redis的數據寫入到資料庫中,當然,redis也支持一些演算法,比如LRU,來設置何時將數據同步到資料庫