国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

服務器之家 - 編程語言 - Java教程 - java高并發寫入用戶信息到數據庫的幾種方法

java高并發寫入用戶信息到數據庫的幾種方法

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

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

假定存在這樣一種情況

多個用戶對數據庫進行寫,我們的業務邏輯規定,每個用戶只能寫一次,大部分用戶也只發一次請求。

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

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

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

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

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

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

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

那咋辦?

方法一

萬年不變的synchronized。

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

當然,我們得承認,有了上面的方法,就不會出現,數據庫里有兩條張三的記錄了

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

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

方法二

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

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

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

方法三

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

String.inter()的缺陷是類 String 維護一個字符串池是放在JVM perm區的,如果用戶數特別多,導致放入字符串池的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個不同的后綴。

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

方法四

?
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,這個方法就不多說了。

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚色成人 | 亚洲第一成人在线视频 | 国产综合精品一区二区三区 | 综合精品久久久 | 欧美女人性 | 久久久亚洲国产美女国产盗摄 | 精品国产乱码久久久久夜 | 丁香久久 | 国产精品国色综合久久 | 欧美一级大片免费 | 黄色电影天堂 | 一级黄色片日本 | 亚洲网在线 | 成人免费在线 | 亚洲精品视频一区二区三区 | 久久天堂视频 | 国产日韩欧美一区二区 | 中文字幕日韩欧美一区二区三区 | 荷兰欧美一级毛片 | 鲁管视频| 91久久精品 | 久久久久久久久久久久网站 | 久久综合久久综合久久 | 一区二区av | 日韩中文视频 | 欧美成人高清视频 | 一本一本久久a久久精品综合妖精 | 欧美精品欧美极品欧美激情 | 亚洲国产精品成人 | 精品中文字幕一区二区 | 国产精品久久久久久久午夜片 | 欧美日韩精品免费 | 亚洲第一av | 九九综合九九 | 午夜看片在线观看 | 毛片91| 午夜a级理论片915影院 | 亚洲成人看片 | 色老头综合网 | 亚洲日韩中文字幕一区 | 噜噜噜噜狠狠狠7777视频 |