精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一篇學會資源庫Repository的性能優化

開發 前端
本篇介紹如何通過快照+diff的方式優化資源庫的性能,之所有能這樣做是因為每個業務用例都需要先通過資源庫獲取到聚合根,最后也需要通過資源庫持久化聚合根。

[[403149]]

在DDD中,聚合根需通過資源庫(Repository)持久化,資源庫將聚合根的存儲與存儲中間件(Mysql、ElasticSearch、MonogoDB等)解耦,我們可以根據聚合的業務特性決定選擇關系型數據庫還是非關系型數據庫存儲聚合根。

很多讀者可能還存在疑問,為什么資源庫只提供一個save方法持久化聚合根。原因是在DDD中,資源庫是聚合根的容器,但并不限制容器是什么做的,也就是前面說的與底層解耦。如果容器是Key-value數據庫做的,是不支持update某個字段的,并且inset和update是不區分的。資源庫與DAO不同,資源庫只是向領域模型提供聚合根以及持久化聚合根。

如果我們選擇關系型數據庫作為聚合根的容器,那么在存儲聚合根時可能就需要將聚合根以及聚合根下的實體拆分到多個表存儲,這就可能導致每次save聚合根都需要執行多條update語句,即便聚合根下的實體并沒有發生任何的改變,即便只是聚合根修改了一個字段(值對象),因此會嚴重影響到應用的性能。

為解決選擇關系數據庫作為聚合根容器導致的性能問題,我們需要付出額外的努力,如用內存快照去判斷每次save聚合根只需要更新哪些表。

基于每個業務用例都需要通過資源庫獲取聚合根最后也通過資源庫持久化聚合根的特性,我們可以在獲取聚合根時創建快照,并且在持久化聚合根時對比(diff)快照,獲取差異信息,只執行需要更新的差異信息。

本篇分享的是筆者實現的一種方案,雖然每個團隊定義的DDD代碼規范不同,但資源庫的實現上差異也并不大,因此也具有參考價值。

首先,抽象聚合根快照存儲器AggregateRootSnapshot,提供緩存聚合根快照、根據聚合根ID獲取快照、移除快照的方法。

提示:我們約定聚合根必須繼承一個抽象類BaseAggregate,該抽象類定義獲取聚合根ID的方法,在緩存快照時可以用聚合根id作為key緩存,這樣在拿的時候才能根據聚合根id拿到。

我們可以使用redis實現聚合根的緩存,但不建議使用性能低的存儲中間件存儲,因為那樣不僅資源庫的性能沒能得到優化,反正還更影響性能。當然,最好的方式是存儲在內存中,雖然犧牲點內存,這便是以空間換時間。

我們使用ThreadLocal存儲聚合根快照,因此編寫的AggregateRootSnapshot實現類如下。

如果聚合根id不是依賴數據庫生成的(我們也不推薦聚合根id依賴數據庫生成,原因在之前的文章已經介紹過了)。為了避免在聚合根為新創建的情況下獲取到錯誤的快照,如線程在執行上一次業務用例(一次接口請求)時,只調用獲取聚合根的方法,之后沒有調用聚合根的存儲方法移除快照(如獲取聚合根詳情),而這次是創建新的聚合根,當然也沒有調用一次資源庫獲取聚合根的方法更新快照,那么這次獲取的就將是前一次的快照,因此我們還需要對比聚合根id是否相同。

只對比聚合根id當然不能確保獲取的就是新的聚合根,能確保聚合根唯一還有這個條件:“基于每個業務用例都需要先通過資源庫獲取到聚合根,最后也需要通過資源庫持久化聚合根的特性”,這句話才是最重要的。

提示:ThreadLocal類型字段非靜態,不會導致內存泄露嗎?答案是不會,后面會講到。

接著,我們為使用關系型數據庫存儲聚合根的資源庫寫一個抽象類,需要使用快照優化性能的資源庫可繼承此抽象類。

RepositorySnapshotSupper實現Repositor接口的findById、save、deleteById方法,另外提供抽象方法由子類實現。因為我們需要在findById獲取到聚合根時創建一份聚合根快照并緩存,在真正save聚合根之前獲取快照完成diff判斷,然后將diff結果交給子類,這樣子類在實現save時就可以根據diff結果減少不必要的sql。

提示:RepositorySnapshotSupper的快照存儲器并非靜態的,而快照存儲器的ThreadLocal類型字段也非靜態,因此我們需要確保一個資源庫只存在一個實例(單例),才不會導致ThreadLocal內存泄露,只是每個聚合根強引用一個ThreadLocal。

以上幾步都不是難點,難點在于如何實現快照的創建,以及diff實現。

快照工具類(SnnapshotUtils)實現思路:

提前條件:要求實體與聚合根提供一個私有的無參構造函數,用于通過反射創建實例。

1.通過反射實現字段值拷貝,當聚合根的字段類型為非實體類型,那么就是值對象類型,對于值對象類型我們只需要拷貝引用即可;

2.如果是實體類型集合,則創建一個新的集合,并將原集合中每個實體元素都拷貝一份添加到新集合,將新集合賦給快照,實體的拷貝規則同聚合根,可使用遞歸實現。

Diff工具類實現思路:

先定義diff結果類型:未修改、新增、更新、刪除。 圖片

1.對于聚合根,如果不存在快照即認為Insert類型,聚合根下的實體也全部為Insert類型;

2.對于聚合根,如果存在快照,那么除實體類型或實體類型集合字段外,只要其它的任意一個值對象不同,就認為聚合根diff結果為Update類型,否則為Non類型;

3.只要聚合根不是新增,不管聚合根有沒有更新,都不會影響聚合根下的實體的diff;

4.如果實體與聚合根一對一,即不是集合類型字段,那么:如果對應實體快照不存在,則認diff結果為Insert,否則如果實體快照存在但新的為null則認為是Delete,否則對比實體的各個值對象,未修改則為Non,修改則為Update;

5.如果實體與聚合根是多對一,即實體集合,如訂單有多個訂單item,那么需要一個個對比:新的item在快照中找不到,則為Insert,快照中的item已經不存在新的實體集合,則為Delete,否則對比item,未修改則為Non,修改則為Update。

定義存儲diff結果的類:

由于BaseAggregate聚合根實現了實體接口(聚合根也是實體),因此我們在EntityDiff中使用Entity引用聚合根/實體,方便后續直接從diff中獲取entity執行插入、更新,或是獲取entitySnapshot執行刪除。(對于實體集合,也可存實體在集合中的索引。)

如果聚合根下的實體字段是集合類型,那么diff結果也使用集合存儲:

diff工具類的實現:

由于項目代碼不便貼出來,在此我簡單寫了一個測試用例,分享下成果。

訂單聚合根:

提示:使用lombok有個坑,如果使用@Builder注解,需要提供一個無參構建方法(建議是私有的構建方法),然后在構建方法上添加@Tolerate注解。

訂單item實體:

訂單資源庫實現:

  • 當聚合根的diff結果類型為Insert時,全量存儲聚合根、聚合根下的實體;
  • 當聚合根的diff結果類型為Non時,不需要更新聚合根,但聚合根下的實體是否需要更新還需要根據聚合根實體的diff結果確定;
  • 當聚合根的diff結果類型為Update時,需要更新聚合根;
  • 獲取實體的diff結果,根據diff結果決定是插入、更新、刪除、還是什么也不做。

單元測試:

單元測試結果如下:

總結

本篇介紹如何通過快照+diff的方式優化資源庫的性能,之所有能這樣做是因為每個業務用例都需要先通過資源庫獲取到聚合根,最后也需要通過資源庫持久化聚合根。出于性能考慮,我們決定以空間換時間,使用ThrealLocal+反射實現創建和緩存聚合根快照,最后也使用反射完成diff邏輯。當然diff類還存在優化空間。

本篇介紹的快照是基于聚合根(DO)的,當然我們還可以基于(PO)去實現,也會更簡單。

注意:本篇圖片中的代碼可能有bug,未更新到優化后的代碼,懶得重新截圖,僅供參考!

參考文獻:

阿里技術專家詳解DDD系列 第三講 - Repository模式

本文轉載自微信公眾號「Java藝術」,可以通過以下二維碼關注。轉載本文請聯系Java藝術公眾號。

 

責任編輯:武曉燕 來源: Java藝術
相關推薦

2023-06-12 07:43:05

知識庫性能優化

2022-08-23 08:00:59

磁盤性能網絡

2022-06-09 08:41:17

Go網絡庫Gnet

2022-01-02 08:43:46

Python

2022-02-07 11:01:23

ZooKeeper

2022-03-02 11:37:57

參數性能調優

2022-06-30 22:53:18

數據結構算法

2021-08-01 07:19:16

語言OpenrestyNginx

2021-10-26 10:40:26

代理模式虛擬

2021-12-04 22:05:02

Linux

2022-05-17 08:02:55

GoTryLock模式

2021-07-06 08:59:18

抽象工廠模式

2023-11-28 08:29:31

Rust內存布局

2023-01-03 08:31:54

Spring讀取器配置

2021-07-02 09:45:29

MySQL InnoDB數據

2022-08-26 09:29:01

Kubernetes策略Master

2021-07-05 22:11:38

MySQL體系架構

2021-05-11 08:54:59

建造者模式設計

2022-04-12 08:30:52

回調函數代碼調試

2022-10-20 07:39:26

點贊
收藏

51CTO技術棧公眾號

成人在线免费观看91| 国产精品自产拍在线观看| 欧美成人精品欧美一级乱| 久久天堂电影| 国产又黄又大久久| 欧美孕妇孕交黑巨大网站| 亚洲图片第一页| 66精品视频在线观看| 色www精品视频在线观看| 手机亚洲第一页| 国产欧美日韩在线一区二区| 欧美日韩视频一区二区| 91网站在线观看免费| 日韩三级电影网| 国内精品久久久久影院薰衣草| 高清在线视频日韩欧美| 国产无遮挡在线观看| 91午夜精品| 欧美日韩日日夜夜| 久久成人免费观看| 99热国产在线| 国产精品日产欧美久久久久| 国内精品久久国产| hs视频在线观看| 日本欧美大码aⅴ在线播放| 久久久久久国产三级电影| 一二三四国产精品| 亚洲v天堂v手机在线| 日韩你懂的在线播放| 亚洲精品www.| av有声小说一区二区三区| 亚洲国产成人av好男人在线观看| 一区二区三区四区欧美| 欧美91精品久久久久国产性生爱| 成人黄色a**站在线观看| 成人亚洲激情网| 免费看污视频的网站| 国产情侣一区| 97福利一区二区| 欧美日韩一级大片| 欧美黄在线观看| 久久久精品一区| 91制片厂在线| 98精品视频| 久久国产一区二区三区| 欧美性生给视频| 99久精品视频在线观看视频| 中文字幕亚洲无线码在线一区| 欧美精品黑人猛交高潮| 久久这里只有精品一区二区| 精品美女在线观看| 亚洲黄色小说在线观看| 伊色综合久久之综合久久| 精品久久国产老人久久综合| 中国老熟女重囗味hdxx| 美国十次综合久久| 日韩欧美成人一区| 欧美日韩一区二区区别是什么| 国产精品国产亚洲精品| 欧美日韩精品免费观看视频| 污色网站在线观看| av在线播放一区二区| 91精品在线免费观看| 做a视频在线观看| 日韩精品一区二区三区中文| 日韩欧美成人一区| 天天躁日日躁狠狠躁av麻豆男男| 国产精品色在线网站| 日韩精品在线观看视频| 成人在线一级片| 久久国产亚洲| 精品自拍视频在线观看| 国产精品50页| 日韩精品一二三区| 91中文精品字幕在线视频| 高清国产mv在线观看| 91视频在线观看免费| 日本一区二区视频| 国产cdts系列另类在线观看| 一区二区三区不卡视频在线观看| 欧美综合在线播放| 国产精品一区二区av影院萌芽| 欧美性大战久久久久久久蜜臀| 色戒在线免费观看| 国产精品超碰| 一区三区二区视频| 国产在线观看99| 日韩电影免费在线看| 亚洲永久免费观看| 欧洲成人av| 亚洲色图欧美激情| 日韩精品视频久久| 99视频有精品高清视频| 日韩国产激情在线| 国产乱子轮xxx农村| 亚洲小说区图片区| 国产精品爽爽爽| 欧美熟妇乱码在线一区| 欧美激情一区在线| www.av片| 亚洲日本免费电影| 日韩美女av在线| www.av成人| 免费在线亚洲欧美| 成人自拍爱视频| av每日在线更新| 亚洲成a人片在线不卡一二三区| 国产精品69页| 国产美女撒尿一区二区| 自拍视频国产精品| 久久精品国产成人av| 国产精品影视网| 视频一区二区三区在线观看| 成全电影大全在线观看| 欧美三区在线观看| avtt香蕉久久| 韩日视频一区| 成人国产精品av| 可以在线观看的av网站| 一区二区在线看| 五月天av在线播放| 国产成人三级| 91av在线免费观看| 亚洲欧美激情在线观看| 中文字幕视频一区| 免费看a级黄色片| 天堂成人娱乐在线视频免费播放网站| 色综合久综合久久综合久鬼88| 国产精品自拍第一页| 2020国产精品自拍| 国产亚洲综合视频| 国产主播性色av福利精品一区| 欧美精品在线第一页| 亚洲香蕉在线视频| 中文幕一区二区三区久久蜜桃| 男女曰b免费视频| 精品自拍偷拍| 久久免费成人精品视频| 开心激情综合网| 亚洲永久免费av| av地址在线观看| 欧美日韩国产探花| 国产精品成人观看视频免费| 在线中文字幕第一页| 欧美一区二区三区影视| 国产精品丝袜一区二区| 国产精品一区二区三区四区| gogogo免费高清日本写真| 一区二区三区| 欧美理论电影在线观看| 性猛交富婆╳xxx乱大交天津| 亚洲私人黄色宅男| 日本网站在线看| 午夜天堂精品久久久久| 99re视频| 国产高清中文字幕在线| 国产丝袜精品第一页| 亚洲 日本 欧美 中文幕| 国产婷婷精品av在线| 男人添女人下面免费视频| 亚洲区综合中文字幕日日| 亚洲自拍偷拍区| 超碰97免费在线| 日韩av中文字幕在线播放| 天堂网免费视频| 国产精品久久久久久久久免费相片| 一区二区三区欧美精品| 黑丝一区二区| 欧美黄色直播| 国产精品久久久久77777丨| 久久久国产精品视频| 成人av免费播放| 精品国产鲁一鲁一区二区张丽| 麻豆av免费观看| 六月婷婷色综合| 青草网在线观看| 中文字幕精品影院| 国产美女搞久久| 免费av不卡在线观看| 亚洲毛片在线免费观看| 91午夜交换视频| 亚洲电影一区二区三区| 51妺嘿嘿午夜福利| 国产福利视频一区二区三区| 啊啊啊一区二区| 99久久精品国产亚洲精品 | 宅男av一区二区三区| 亚洲视频国产精品| 国产999精品久久久| 美女免费久久| 日韩激情视频在线播放| 亚洲视频一区二区三区四区| 亚洲一区二区三区四区的| 91精品人妻一区二区三区蜜桃欧美| 污污网站免费在线观看| 红桃视频成人在线观看| 国产精品麻豆免费版现看视频| 国产成人av电影在线观看| 国产美女无遮挡网站| 婷婷综合视频| 日本福利一区二区三区| 99国产精品免费网站| 国产精品永久免费| 忘忧草在线影院两性视频| 久久亚洲精品成人| 欧美男男同志| 亚洲大胆人体在线| 一级做a爱片性色毛片| 日韩欧美在线视频免费观看| 麻豆一区产品精品蜜桃的特点| 久久久久久久av麻豆果冻| 美女伦理水蜜桃4| 精品亚洲国产成人av制服丝袜| 你懂的av在线| 精品二区视频| 日本丰满大乳奶| 成人一区二区| 欧美精品与人动性物交免费看| 日韩高清在线观看一区二区| 国产精品丝袜白浆摸在线| 欧美黑人疯狂性受xxxxx野外| 欧美韩国理论所午夜片917电影| а√天堂中文在线资源bt在线| 日韩av一区二区在线| xxxx国产精品| 欧美一区二区黄| 亚洲综合一区中| 欧美午夜一区二区三区 | jizz在线观看视频| 亚洲欧美一区二区激情| 深夜福利免费在线观看| 日韩激情第一页| 涩爱av在线播放一区二区| 亚洲激情小视频| 神马午夜一区二区| 精品国产伦一区二区三区观看方式| 99热这里精品| 91精品国产乱码久久蜜臀| 国产精品无码AV| 在线不卡a资源高清| 一级片一区二区三区| 欧美三级日韩在线| 中文字幕人妻丝袜乱一区三区| 在线日韩一区二区| 最近中文字幕av| 欧美日韩精品三区| 国产欧美第一页| 日韩亚洲电影在线| 亚洲av少妇一区二区在线观看| 91精品欧美久久久久久动漫| 国产一区二区三区中文字幕 | av网站在线免费看| 日韩天堂在线观看| 丰满人妻一区二区三区免费| 精品久久久久久亚洲综合网| 欧美一级片免费| 日韩高清不卡av| 国产福利在线| zzijzzij亚洲日本成熟少妇| 成码无人av片在线观看网站| 九九精品视频在线| 神马午夜在线视频| 国产精品久久97| 亚洲精品无播放器在线播放| 亚洲专区中文字幕| 久久亚洲道色| 亚洲国产一区二区精品视频| 91精品国产91久久久久久黑人| 久久久久福利视频| av成人国产| 中文字幕亚洲乱码| 国产精品一二三在| 国产成人无码一区二区在线观看| 国产亚洲一二三区| www日韩在线| 精品美女永久免费视频| 天天综合久久综合| 日韩三级在线观看| 欧美色视频免费| 久热精品视频在线观看一区| 国产丝袜精品丝袜| 国产精品劲爆视频| 成人涩涩网站| 亚洲免费久久| 日韩午夜免费视频| 激情五月俺来也| 成人教育av在线| 啪啪一区二区三区| 欧美日韩一区二区在线 | 日日噜噜噜夜夜爽爽| 狠狠88综合久久久久综合网| 国产精品人人妻人人爽人人牛| 国产在线不卡一区| 在线 丝袜 欧美 日韩 制服| 中文字幕一区二区三区精华液| 日本视频www| 91麻豆精品国产91久久久资源速度| 免费观看黄色一级视频| 最近中文字幕2019免费| 1区2区在线| 成人一区二区电影| 欧美日韩播放| 97免费视频观看| 久久精品国产999大香线蕉| 色婷婷精品久久二区二区密| 亚洲欧美在线视频| 国产伦精品一区二区三区视频网站| 欧美一级午夜免费电影| 第一视频专区在线| 91精品国产九九九久久久亚洲| 国产一区二区三区| 亚洲精品人成| 老牛国产精品一区的观看方式| 亚洲免费观看在线| 日韩一区日韩二区| 久久久999久久久| 国产视频在线观看一区二区| 超碰97免费在线| 亚洲一区二区在线| 久久大综合网| 日日噜噜夜夜狠狠| 久久亚洲二区三区| 日本一级片免费看| 精品国产乱码久久久久久夜甘婷婷 | 久久久久久蜜桃| 欧美一级视频精品观看| 毛片在线看片| 国产日韩欧美另类| 日韩久久精品| 欧美婷婷精品激情| 国产视频一区不卡| 少妇久久久久久久| 亚洲日韩欧美视频一区| 亚洲女色av| 欧洲av一区| 日韩av高清在线观看| 国产一区二区三区四区五区六区 | 日本中文字幕片| 91免费视频观看| 99久热在线精品996热是什么| 亚洲精品720p| 天堂电影一区| 欧美区高清在线| 日韩成人精品视频| 农村老熟妇乱子伦视频| 欧美视频一区二区| 日本天堂在线观看| 国产欧美日韩视频| 911久久香蕉国产线看观看| 日日夜夜精品视频免费观看| 亚洲欧美经典视频| 亚洲成人第一区| 性欧美xxxx视频在线观看| 日韩三级视频| 91视频免费版污| 国产精品麻豆网站| av资源免费看| 国模极品一区二区三区| 一区二区三区视频免费观看 | 高清成人免费视频| 日本熟女一区二区| 亚洲欧美一区二区三区情侣bbw | 秋霞在线视频| 久久精品成人一区二区三区蜜臀| 亚洲欧美激情诱惑| 阿v天堂2014| 欧美一区二区三区四区久久 | 国产精品三级网站| 天天综合亚洲| 中文字幕乱视频| 在线观看日韩高清av| 欧美18一19xxx性| 国产精品香蕉视屏| 日韩精品一级中文字幕精品视频免费观看 | 国产乱淫片视频| 久久免费视频网| 欧美精品色图| 极品人妻一区二区| 一本一道久久a久久精品综合蜜臀| 亚洲麻豆精品| 国产精品中出一区二区三区| 丝袜脚交一区二区| 欧美日韩免费做爰视频| 亚洲欧洲第一视频| 国产精品一区三区在线观看| a级黄色一级片| 国产精品伦理一区二区| 日日夜夜精品免费| 国产精品一区二区三区成人| 影院欧美亚洲| 潘金莲一级黄色片| 日韩理论片久久| 精品视频一二| 免费裸体美女网站| 亚洲一区视频在线观看视频| 成人h小游戏| 精品欧美一区二区三区久久久| 久久99精品国产麻豆婷婷洗澡| xxxx.国产| 久久久久久久久久国产|