激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務器之家 - 編程語言 - Java教程 - java高并發(fā)寫入用戶信息到數(shù)據(jù)庫的幾種方法

java高并發(fā)寫入用戶信息到數(shù)據(jù)庫的幾種方法

2020-08-23 14:27程序員小董 Java教程

本文主要介紹了java高并發(fā)寫入用戶信息到數(shù)據(jù)庫的幾種方法,具有很好的參考價值。下面跟著小編一起來看下吧

假定存在這樣一種情況

多個用戶對數(shù)據(jù)庫進行寫,我們的業(yè)務邏輯規(guī)定,每個用戶只能寫一次,大部分用戶也只發(fā)一次請求。

java" id="highlighter_54532">
?
1
2
3
public void write(Uers u){
 // do something
}

但是有一種情況(1%的情況下吧)的就是有的用戶會發(fā)兩次甚至更多次寫請求(因為數(shù)據(jù)庫限制,我們不方便在主鍵上做文章)。

如果這個特殊的用戶發(fā)送的兩次請求時間間隔比較大,那就簡單了,再每次寫入的時候,寫去數(shù)據(jù)庫里看看,這個人有沒有寫過,如果已經(jīng)寫過了,就直接拋棄這個請求。

?
1
2
3
4
5
public void write(Uers u){
 if(!checkIfExistUser(u)){
   // do something
  }
}

不過最大的問題就是,如果用戶幾乎在瞬時,發(fā)送了兩個寫操作。

而且假定我們的do something比較耗時,那么上面的策略就有可能失敗。

為啥失敗?我不用解釋了吧。

那咋辦?

方法一

萬年不變的synchronized。

?
1
2
3
4
5
public synchronized void write(Uers u){
 if(!checkIfExistUser(u)){
   // do something
  }
}

當然,我們得承認,有了上面的方法,就不會出現(xiàn),數(shù)據(jù)庫里有兩條張三的記錄了

但上面的鎖的粒度太大了,張三寫的時候,李四也不能寫了。

其實我們想要的只是:張三自己本人,不能同時多次寫入。

方法二

類 String 維護一個字符串池。 當調(diào)用 intern 方法時,如果池已經(jīng)包含一個等于此 String 對象的字符串(該對象由 equals(Object) 方法確定),則返回池中的字符串。可見,當String相同時,String.intern()總是返回同一個對象,因此就實現(xiàn)了對同一用戶加鎖。由于鎖的粒度局限于具體用戶,使系統(tǒng)獲得了最大程度的并發(fā)。

?
1
2
3
4
5
public synchronized void write(Uers u){
  synchronized(u.getUserId.intern()) {
   // do something
  }
}

上面的思路就保證了張三寫的時候,李四可以寫,但是不能兩個張三一塊寫。

方法三

其實我個人覺得,方法二已經(jīng)很好了,如果非要說方法二還有什么問題的話,只能說:

String.inter()的缺陷是類 String 維護一個字符串池是放在JVM perm區(qū)的,如果用戶數(shù)特別多,導致放入字符串池的String不可控,有可能導致OOM錯誤或者過多的Full GC。

那咋辦?

?
1
2
3
4
5
6
public synchronized void write(Uers u){
  String userSuffix=getSuffix(u);
  synchronized(userSuffix.intern()) {
   // do something
  }
}

至于那個獲得后綴的策略,大家自己想。

有了這個策略,我就能保證1億個用戶,可能只有10000個不同的后綴。

有可能張三李四的后綴一樣,但是張三李四同時發(fā)請求的概率,應該也不會太大。就算真的同時發(fā)了,那你等一下不行么?

方法四

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Map locks = new Map();  
List lockKeys = new List();  
for(int number : 1 - 10000) {  
  Object lockKey = new Object();  
  lockKeys.add(lockKey);  
  locks.put(lockKey, new Object());  
}   
public void doSomeThing(String uid) {  
  Object lockKey = lockKeys.get(uid.hash() % lockKeys.size());  
  Object lock = locks.get(lockKey);  
  synchronized(lock) {  
   // do something  
  }  
}
 

個人感覺和方法三的核心差不多。

方法五

如果是集群情況下,兩個張三幾乎瞬時進入兩臺服務器,那java語言級別的鎖都得報廢。

可以使用redis的分布式鎖

方法六

使用zookeeper

只是聽說有這么一個思路,但是本人沒用過zookeeper,這個方法就不多說了。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持服務器之家!

原文鏈接:http://blog.csdn.net/dlf123321/article/details/57955491

延伸 · 閱讀

精彩推薦
398
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 成年免费视频黄网站在线观看 | 蜜桃网站在线观看 | 国产chinesehd精品91 | 中文字幕 亚洲一区 | 国产pron | 黑人日比 | 黄污网站在线观看 | 爱逼av | h视频在线免费观看 | 成人啪啪色婷婷久 | 一区播放 | 91精品国产91久久久久久吃药 | 天天鲁在线视频免费观看 | 成人免费毛片在线观看 | 91精品国产91久久久久久 | 久久无| 深夜小视频在线观看 | 国产日韩在线观看一区 | 国产成年人视频 | 久久久aa| 破处av在线 | 性 毛片| 日本不卡视频在线观看 | 国产成人视屏 | 天天看夜夜爽 | 久久综合婷婷香五月 | 国产深夜福利视频在线播放 | 四虎久草 | 国产免费观看一区二区三区 | 九九视屏 | 一区二区三区黄色 | 国产亚洲精品久久久久5区 日韩一级片一区二区三区 国产精品久久久久av | 欧美一级成人一区二区三区 | 91伊人久久| 高清久久久 | 九九热在线精品视频 | 国产精品嘿咻嘿咻在线播放 | 欧美激情精品久久久久久黑人 | 黄网站免费在线看 | 精品国产高清一区二区三区 | 国产91丝袜在线播放 |