本站AI自動判斷提供您所需要的app下載:點我下載安裝,你懂的APP
編輯導(dǎo)語:技術(shù)的發(fā)展為人們的生活帶來了更多豐富體驗,比如結(jié)合了VR、AR技術(shù)的產(chǎn)品可以為用戶帶來更強、更逼真的互動感。如果將VR與棋牌結(jié)合呢?一款VR棋牌產(chǎn)品,是否是有市場發(fā)展前景的呢?本文作者就對VR棋牌這一形式做了對應(yīng)解讀,一起來看一下。
客戶未如愿以償抱到健康孩子,交易失敗后孩子如何安排,陳浩三緘其口,不愿多說。
朋友圈可能就沒朋友了……
前后踢腿以及腿部可動(為什么上支架?因為太重了站不穩(wěn)啦,白色的是啥?是充電寶,找不到重東西)
對這個圖中涉及的原理做一個簡單解釋,讀者如果對細節(jié)感興趣,在隨意起一個使用了 mybatis-spring 的項目,將圖中關(guān)點節(jié)點打上斷點觀察即可。
配置定義
與此同時,行業(yè)內(nèi)競爭也在加劇,不惜大幅度降價搶客戶挖人的例子比比皆是,圈內(nèi)人都已習(xí)以為常。為了給客戶留下更好的服務(wù)印象,“專車接送”到公司考察已成普遍現(xiàn)象。
其實買了10多款,拍攝那天只到了8款,幾萬塊錢就這么真金白銀花出去了,只為幫大家避坑。
腰部的前后仰 此處注意腰部的脫出
身體難受,需要加濕器幫我提高濕度。
本報見習(xí)記者丁 一
本著不重復(fù)造輪子的原則,我們基礎(chǔ)的分庫分表能力還是借助現(xiàn)有的分庫分表中間件,我們要做的是輔助分庫分表中間件適配更多的 sql 場景和做好 sql 分發(fā),所以我們定位在分庫分表中間件上層做 plus。
在安全箱下層為附件部分,包括全尺寸HDMI視頻線、Micro HDMI轉(zhuǎn)接線、云臺支架以及紙質(zhì)說明書。
差不多接近尾聲了
(紅色為輔助觀看線)
游某被依法給予行政處罰
手掌為球形關(guān)節(jié)
ResultSetHandler 負責(zé)將 JDBC 返回的 ResultSet 結(jié)果集對象轉(zhuǎn)換成 List 類型的集合;處理查詢結(jié)果;
一、原始問題
遷移至分庫分表后,為了保證數(shù)據(jù)被查詢到且保證查詢的性能,一般情況下 sql 的查詢條件需要帶上分表(片)鍵,但一個已經(jīng)運轉(zhuǎn)多年的業(yè)務(wù)系統(tǒng)它的 sql 肯定不能完全滿足這個要求,如果進行全量的 sql 改寫將是一個巨大的工作量,且有些業(yè)務(wù)場景根本就無法進行 sql 改寫,比如輔營交易系統(tǒng)表的分表鍵一般是自身業(yè)務(wù)的訂單號,但它有根據(jù)第三方券碼查訂單的客觀需求( 一般是三方回調(diào)接口中)。
二、第一次平滑遷移至分庫分表的實踐
簡單來說第一次進行分庫分表的平滑升級,其主要思路是:
最新超變單職業(yè)傳奇手游 傳奇手游超變單職業(yè)游戲推薦 - 櫻花動漫
2.1 前置知識
2.1.1 mybatis的整的框架
2.1.2 Mybatis-Spring及Mybatis的處理流程
2.2 數(shù)據(jù)雙寫
第一個問題是,在 mybatis 內(nèi)部如何正確切換執(zhí)行的目標(biāo)庫;
第二個問題是,在 mybatis 內(nèi)部如何對 sql 的執(zhí)行過程進行復(fù)制并用分庫的執(zhí)行結(jié)果替換掉原有的執(zhí)行結(jié)果。
對于第一個問題
我們第一版本的做法是直接從待切數(shù)據(jù)源(分表)中重新獲取 sqlSession,通過 Spring 的事務(wù)管理 api 來判定當(dāng)前是否屬于事務(wù)環(huán)境,如果是事務(wù)環(huán)境,則先從線程上下文中獲取,如果不存在再從待先切數(shù)據(jù)源中獲取。
對于第二個問題
為了解決 mybatis 插件內(nèi)部再次調(diào)用 sql(再次調(diào)用是原于下文中分表鍵的處理)出現(xiàn)上下文間的干擾,我們定義 sql 執(zhí)行的父子上下文的概念,父上下文感知不到子上下文的存在,子上下文對變量做的任何修改、覆蓋或添加只在子上下文中有效,在父上下文環(huán)境下都是無效的,這相當(dāng)于給子上下文開了一個安全的環(huán)境,在內(nèi)部執(zhí)行的 sql 不會對外層環(huán)境產(chǎn)生破壞。第二個問題是由我們的技術(shù)實現(xiàn)方案帶來的新問題,所謂的上下文干擾一般包含分庫分表中間件內(nèi)部基于 ThreadLocal 做的一些變量記錄,在 mybatis 插件內(nèi)部再次調(diào)用另一條 sql 時可能就會出插件內(nèi)調(diào)用的 sql 的上下文污染了原將要執(zhí)行 sql 上下文。
雙寫其實可以在 mybatis 外部進行的, 在 mybatis 外部進行時就沒有那么復(fù)雜的 statement 的復(fù)制和其參數(shù)的構(gòu)建過程,但由于當(dāng)時我們系統(tǒng) mybatis 外部調(diào)用入口多且不統(tǒng)一,且先前在 Dao 層做了很多特殊注解和功能,這些功能沒有考慮有兩個完全一樣的 Dao 的情況,直接在 mybatis 外部進行雙寫,改動太多其負面影響也不好預(yù)估,所以才在 mybatis 插件內(nèi)部做了雙寫的實現(xiàn)。
2.3 分表鍵映射
2.4 diff和事務(wù)
再來說一下事務(wù),事務(wù)用來保證兩個地方的一致性。第一個是映射表與業(yè)務(wù)表的一致性,兩方表任何一方漏數(shù)據(jù)必然導(dǎo)至業(yè)務(wù)在某個查詢下檢索不到數(shù)據(jù),所以對于映射表的操作是和業(yè)務(wù)表的操作強綁在一個事務(wù)中。第二個是單庫與分庫在進行雙寫時也需要在一個事務(wù)中,這里顯然要使用到分布式事務(wù),傳統(tǒng)的幾種分布式事務(wù)都不適用我們的場景,不是需要一定的業(yè)務(wù)侵入配合就是性能上有影響,我們在這里采用了一種特殊的"分布式"事務(wù)的設(shè)計,既滿足了性能要求,又能盡量做到一致性。其實現(xiàn)原理參見下圖:
事務(wù)管理器只能設(shè)置一個 DataSoure,當(dāng)在事務(wù)環(huán)境下需要對另外一個數(shù)據(jù)源進行操作時,會將另一個數(shù)據(jù)源中獲取的 connection 包在一個 Spring 的事務(wù)同步器中,并將這個 connection 的 autoCommit 屬性設(shè)置為 false, 在同步器的回調(diào)函數(shù) beforeCompletion 中分別增加 SqlSessionHolder 和 ConnectionHolder 引用計數(shù)(不增加會被 Spring和 mybatis 框架錯誤回收,到 afterCompletion 環(huán)節(jié)時連接就可能是已經(jīng)關(guān)閉狀態(tài)), 在 afterCompletion 回調(diào)函數(shù)中根據(jù)事務(wù)狀態(tài)對這個 connection 做提交或回滾,并分別將 SqlSessionHolder 和 ConnectionHolder 引用計數(shù)減一,將 autoCommit 重置為 true。
三、新的問題
四、分庫分表平滑遷移組件化
4.1 前置知識
4.1.1 關(guān)鍵名稱解釋
4.1.2分庫分表中間件的基本原理
4.2 設(shè)計思路
4.2.1 設(shè)計定位
4.2.2 設(shè)定切入點
4.2.3 路由引導(dǎo)
4.2.4 sql路由
4.3 整體架構(gòu)
4.4 核心實現(xiàn)
4.4.1 核心代碼流程
4.4.2 關(guān)鍵點
第一條配置作用時間是2000-01-01至2023-11-01,這期間是沒有分表的;第二條配置作用從2023-11-01開始,每間隔一個月hash分兩張表;這樣就相當(dāng)于業(yè)務(wù)無感知的從單表過渡到分表了。對于單庫和分庫的切換則使用的是多環(huán)境打包完成的,不同環(huán)境激活的是不同的數(shù)據(jù)源,單庫激活的是單庫的數(shù)據(jù)庫連接池,多庫激活多庫的連接池。sharding.properties 這個配置文件也可以在不同環(huán)境中存在不同的內(nèi)容;這樣就可以很方便的做到本地測試用單庫,測試和線上環(huán)境使用分庫分表了。 注意要將不同環(huán)境的分表鍵及映射鍵的規(guī)則定義一致,這樣在單庫上能跑通的 sql 在分庫分表環(huán)境上也不會有任何問題(因為只要分表的配置規(guī)則相同,即使底層數(shù)據(jù)源是單庫或者沒有用分庫分表中間件,我們內(nèi)部的那些路由判定規(guī)則一樣會執(zhí)行,不符合要求的 sql 是能暴露出來的)。
第一件事是劃清了本組件與分庫分表中間件的邊界,即雙方只按標(biāo)準(zhǔn)接口對接;第二件事相當(dāng)于是讓分庫分表中件間通過自定義策略的方式將它的分庫分表規(guī)則委托給我們的組件,從而避免兩頭配置上的沖突,也就是最終如何分庫分表將以我們的配置解釋為準(zhǔn)。
4.5 接入層實現(xiàn)
本文介紹了兩次進行平滑分庫分表的設(shè)計,第一次是在已經(jīng)運行多年的系統(tǒng)上進行分庫分表改造,這個過程為了求穩(wěn),主要采用了雙寫加 diff 的方式通過一條條的 sql 切換來降低升級過程中的風(fēng)險,同時對于不支持分表鍵查詢的 sql 采用了映射鍵和映射表的方式解決;第二次是在從舊系統(tǒng)拆分出新系統(tǒng)過程中,新系統(tǒng)也有分庫分表需求,為了照顧新系統(tǒng)的易用性以及初始編碼過程中可能出現(xiàn)的變化,減少底層分庫分表的變化對上層業(yè)務(wù)編碼的返工,在承接第一次方案的設(shè)計的基礎(chǔ)上將方案進行了組件化。基于開發(fā)成本和開發(fā)時間的考慮,目前產(chǎn)出盡管不通用,但他完成了我們當(dāng)時的首要目標(biāo)——完成業(yè)務(wù)應(yīng)用的 DDD 和微服務(wù)拆分。